当前位置: 编程技术>移动开发
本页文章导读:
▪BaseExpandableListAdapter的施用 BaseExpandableListAdapter的使用
资源来自于网络----------------------->
图片见附件
项目需要展示一个通讯簿,通讯簿中的手机号码是分组的,要求勾选组时,自动勾选组下的手机号码,实现.........
▪ 施用广播机制来完成版本更新模块(详解) 运用广播机制来完成版本更新模块(详解)
先看下主配置文件:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaoma.www"
android:versi.........
▪ 照相机的简单调用Demo 相机的简单调用Demo
主类:package com.mzh.www;
import java.io.ByteArrayOutputStream;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.........
[1]BaseExpandableListAdapter的施用
来源: 互联网 发布时间: 2014-02-18
BaseExpandableListAdapter的使用
package eoe.ydtf.android;
public class PhoneListItem {
public String phone,name;
public boolean checked;
public PhoneListItem(String _name,String _phone,boolean _checked){
name=_name;
phone=_phone;
checked=_checked;
}
}
复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:minHeight="40px"
android:layout_gravity="center_vertical">
<CheckBox
android:id="@+id/phone_check"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="35px"
android:checked="false"/>
<TextView
android:id="@+id/phone_name"
android:layout_width="80dip"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/phone_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:paddingLeft="10px"
android:layout_gravity="center_vertical" />
</LinearLayout>
复制代码
import java.util.List;
public class PhoneGroup {
public String title;
private boolean checked;
public List<PhoneListItem> children;
public PhoneGroup(String title,boolean checked,List<PhoneListItem> children){
this.title=title;
setChecked(checked);
this.children=children;
}
public boolean getChecked(){
return checked;
}
public void setChecked(boolean b){
checked=b;
if(children!=null&&children.size()>0){//若children不为空,循环设置children的checked
for(PhoneListItem each : children){
each.checked=checked;
}
}
}
}
复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ExpandableListView
android:id="@+id/phonelist"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
复制代码
package eoe.ydtf;
import java.util.ArrayList;
import java.util.List;
import com.ydtf.android.PhoneGroupAdapter.ExpandableListHolder;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
public class QxtSelectPhone extends Activity implements
ExpandableListView.OnGroupClickListener,ExpandableListView.OnChildClickListener{
private List<PhoneGroup> groups;
private PhoneGroupAdapter exlist_adapter = null;
private ExpandableListView exlist;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载layout
setContentView(R.layout.phone_browser);
//取得listview
exlist = (ExpandableListView) findViewById(R.id.phonelist);
//调用init方法,这个方法主要是,初始化一些数据
init();
//构建expandablelistview的适配器
exlist_adapter = new PhoneGroupAdapter(this, groups);
exlist.setOnChildClickListener(this);
exlist.setAdapter(exlist_adapter); //绑定视图-适配器
}
private void init() {
groups = new ArrayList<PhoneGroup>();
//构建List用作group1的子项
List<PhoneListItem> group1_children = new ArrayList<PhoneListItem>();
//往List中添加内容
PhoneListItem item = new PhoneListItem("和文明","1308763994", false);
group1_children.add(item);
item = new PhoneListItem("黄文明","1308763994", false);
group1_children.add(item);
item = new PhoneListItem("王文明","1308763994", false);
group1_children.add(item);
//拼装成 PhoneGroup
PhoneGroup phonegroup1=new PhoneGroup("group1",false,group1_children);
//------把前面的代码复制一遍,再添加一个组group2
//构建List用作group2的子项
List<PhoneListItem> group2_children = new ArrayList<PhoneListItem>();
//往List中添加内容
item = new PhoneListItem("张文明","1589065423", false);
group2_children.add(item);
item = new PhoneListItem("李文明","1589065423", false);
group2_children.add(item);
item = new PhoneListItem("赵文明","1589065423", false);
group2_children.add(item);
//拼装成 PhoneGroup
PhoneGroup phonegroup2=new PhoneGroup("group2",false,group2_children);
//添加进groups数组
groups.add(phonegroup1);
groups.add(phonegroup2);
}
//当分组行背点击时,让分组呈现“选中/取消选中”状态。
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
PhoneGroupAdapter.ExpandableListHolder holder=(ExpandableListHolder) v.getTag();
holder.chkChecked.setChecked(!holder.chkChecked.isChecked());
groups.get(groupPosition).children.get(childPosition).checked=
!groups.get(groupPosition).children.get(childPosition).checked;
return false;
}
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
// groups.get(groupPosition).setChecked(!groups.get(groupPosition).getChecked());
// exlist_adapter.notifyDataSetChanged();
return false;
}
}
复制代码
package eoe.ydtf.android;
import java.util.List;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
public class PhoneGroupAdapter extends BaseExpandableListAdapter {
class ExpandableListHolder { //定义一个内部类,用于保存listitem的3个子视图引用,2个textview和1个checkbox
TextView tvName;
TextView tvPhone;
CheckBox chkChecked;
}
private Context context; //父activity
private LayoutInflater mChildInflater; //用于加载listitem的布局xml
private LayoutInflater mGroupInflater; //用于加载group的布局xml
private List<PhoneGroup> groups; //所有group
//构造方法:参数c - activity,参数group - 所有group
public PhoneGroupAdapter(Context c,List<PhoneGroup> groups){
context=c;
mChildInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mGroupInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.groups = groups;
}
@Override
public Object getChild(int arg0, int arg1) {//根据组索引和item索引,取得listitem // TODO Auto-generated method stub
return groups.get(arg0).children.get(arg1);
}
@Override
public long getChildId(int arg0, int arg1) {//返回item索引
return arg1;
}
@Override
public int getChildrenCount(int groupPosition) {//根据组索引返回分组的子item数
return groups.get(groupPosition).children.size();
}
@Override
public Object getGroup(int groupPosition) {//根据组索引返回组
return groups.get(groupPosition);
}
@Override
public int getGroupCount() {//返回分组数
return groups.size();
}
@Override
public long getGroupId(int groupPosition) {//返回分组索引
return groupPosition;
}
@Override
public View getGroupView(int position, boolean isExpanded,
View view, ViewGroup parent) {//根据组索引渲染"组视图"
ExpandableListHolder holder = null; //清空临时变量holder
if (view == null) { //判断view(即view是否已构建好)是否为空
//若组视图为空,构建组视图。注意flate的使用,R.layout.browser_expandable_list_item代表了
//已加载到内存的browser_expandable_list_item.xml文件
view = mGroupInflater.inflate(
R.layout.phone_list_item, null);
//下面主要是取得组的各子视图,设置子视图的属性。用tag来保存各子视图的引用
holder = new ExpandableListHolder();
//从view中取得textView
holder.tvName = (TextView) view.findViewById(R.id.phone_name);
//从view中取得textview
holder.tvPhone = (TextView) view.findViewById(R.id.phone_number);
//从view中取得checkbox
holder.chkChecked = (CheckBox) view
.findViewById(R.id.phone_check);
// holder.chkChecked.setEnabled(false);//禁用checkbox
//把checkbox、textview的引用保存到组视图的tag属性中
view.setTag(holder);
} else { //若view不为空,直接从view的tag属性中获得各子视图的引用
holder = (ExpandableListHolder) view.getTag();
}
//对应于组索引的组数据(模型)
PhoneGroup info = this.groups.get(position);
if (info != null) {
//根据模型值设置textview的文本
holder.tvName.setText(info.title);
//根据模型值设置checkbox的checked属性
holder.chkChecked.setChecked(info.getChecked());
holder.chkChecked.setTag(info);
holder.chkChecked.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
PhoneGroup group=(PhoneGroup)v.getTag();
group.setChecked(!group.getChecked());
notifyDataSetChanged();
}
});
}
// TODO Auto-generated method stub
return view;
}
//行渲染方法
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ExpandableListHolder holder = null; //清空临时变量
if (convertView == null) { //若行未初始化
//通过flater初始化行视图
convertView = mChildInflater.inflate(
R.layout.phone_list_item, null);
//并将行视图的3个子视图引用放到tag中
holder = new ExpandableListHolder();
holder.tvName = (TextView) convertView
.findViewById(R.id.phone_name);
holder.tvPhone = (TextView) convertView.findViewById(R.id.phone_number);
holder.chkChecked = (CheckBox) convertView
.findViewById(R.id.phone_check);
// holder.chkChecked.setEnabled(false);
convertView.setTag(holder);
} else { //若行已初始化,直接从tag属性获得子视图的引用
holder = (ExpandableListHolder) convertView.getTag();
}
//获得行数据(模型)
PhoneListItem info = this.groups.get(groupPosition)
.children.get(childPosition);
if (info != null) {
//根据模型数据,设置行视图的控件值
holder.tvName.setText(info.name);
holder.tvPhone.setText(info.phone);
holder.chkChecked.setChecked(info.checked);
holder.chkChecked.setTag(info);
holder.chkChecked.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
CheckBox check=(CheckBox)v;
PhoneListItem item=(PhoneListItem)v.getTag();
item.checked=!item.checked;
// check.setChecked(!check.isChecked());
}
});
}
return convertView;
}
@Override
public boolean hasStableIds() {//行是否具有唯一id
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {//行是否可选
return true;
}
}
资源来自于网络----------------------->
图片见附件
项目需要展示一个通讯簿,通讯簿中的手机号码是分组的,要求勾选组时,自动勾选组下的手机号码,实现效果如下:
我们这个实例主要讲的就是当点击一个分组的时候,分组里的所有人就默认的全部选中,有了这个功能我们在群发的时候就会给我们省去不少麻烦,这样我们就可以不用一个一个的选中了。那么我们就来看看这个效果是怎么样实现吗。
下面是实现步骤。
1、新建类PhoneListItem,用于表示分组中的每一个手机号码。
Java代码:
2011-4-7 15:07:02 上传
下载附件 (36.65 KB)
2011-4-7 15:07:02 上传
下载附件 (36.65 KB)
2、新建布局文件phone_list_item.xml,用于定义分组下面的每一条手机记录的页面布局。
Java代码:
这个主要就是我们在这里布局,你想要什么样的效果都可以,这里就是上面效果图的布局
3、新建类PhoneGroup,用于表示一个分组。代码当中主要就是在一个分组里的内容,我们在用一个boolean值,这个就是说当你选中的时候是真,当你没有选中的时候是假,所以这个很主要,有了boolean值才能知道你是否选中。
Java代码:
4、新建Activity布局文件phone_browser.xml,用于定义通讯簿的展现页面。
Java代码:
5、新建类QxtPhoneSelect,用于呈现通讯簿的Activity页面。
Java代码:
6、新建类PhoneGroupAdapter,实现BaseExpandableListAdapter。
Java代码:
[2] 施用广播机制来完成版本更新模块(详解)
来源: 互联网 发布时间: 2014-02-18
运用广播机制来完成版本更新模块(详解)
先看下主配置文件:
再看下主控制类:
下面来看下后台服务下载的代码:
以下是后台下载时用到的文件工具类代码:
先看下主配置文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xiaoma.www" android:versionCode="20111111" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".BroadCastUpdateVersionActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 下载服务注册 --> <service android:name=".DownloadService"></service> <!-- XML配置方式实现广播注册 --> <!-- <receiver android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . .这些是receiver里面的属性,爽吧?嘿嘿,不懂的朋友们可跟下链接 : http://developer.android.com/guide/topics/manifest/receiver-element.html </receiver> --> <!-- <receiver android:name="此处是你写的单独的广播子类,必须是完整路径" > <intent-filter> <action android:name="com.xiaoma.comeon"/> </intent-filter> </receiver> --> </application> </manifest>
再看下主控制类:
package com.xiaoma.www; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; /** * @Title: BroadCastUpdateVersionActivity.java * @Package com.xiaoma.www * @Description: 运用广播机制来完成版本更新模块 * @author MZH */ public class BroadCastUpdateVersionActivity extends Activity { private Button checkBtn; private BroadcastUpdateReceiver bur = null ; private static final String BROADCAST_ACTION = "com.xiaoma.comeon"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /** * 此处:注册广播的方式两种,小马顺带讲下 * 方式一:XML方式在Manifest配置中注册 请看全局配置文件注册receiver * 方式二:纯代码注册如下,此处需要特别注意的是,如果使用代码注册广播的话,注册必须在发起 * 广播之前 ,否则广播无效或报错,还有就是尽量用内部类实现广播时采用这种注册方式 */ //注册是否有新版本广播 registerBroadCast(); init(); } /** * 是否有新版本广播注册实现 */ private void registerBroadCast(){ //注册之前先得有个BroadCastReceiver的子类 bur = new BroadcastUpdateReceiver(); IntentFilter filter = new IntentFilter(); //下面的BROADCAST_ACTION与全局配置中的receiver标签子标签 //intentfilter的action的name值是一致的哦 filter.addAction(BROADCAST_ACTION); registerReceiver(bur, filter); } /** * 内部类实现广播 * @Title: BroadCastUpdateVersionActivity.java * @Package com.xiaoma.www * @Description: 接收是否下载完成广播事件 * @author MZH */ public class BroadcastUpdateReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); String status = bundle.getString("服务器返回给你的标志位"); if (status.equals("如:success")){ String urlStr = "file:///"+ bundle.getString("Path"); //以下这个Intent是指当下载完成后,用新的安装VIEW来提示用户是否安装刚下载好的APK Intent i = new Intent(Intent.ACTION_VIEW); //解析设置服务器返回数据类型 intent.setDataAndType(Uri.parse(urlStr), "application/vnd.android.package-archive"); startActivity(intent); }else{ Toast.makeText(BroadCastUpdateVersionActivity.this, "下载更新版本失败", Toast.LENGTH_SHORT).show(); } BroadCastUpdateVersionActivity.this.finish(); } } /** * 初始化信息实现 */ private void init(){ checkBtn = (Button)findViewById(R.id.checkVersion); checkBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /** * 这里小马讲下在AndroidManifest.xml文件中版本号的一些限制,小马注释写详细些 * 希望大家不要嫌啰嗦,我只希望帮忙大家更多,了解得更透彻 * 首先:http://developer.android.com/guide/topics/manifest/manifest-element.html * 可双上面的链接中看到如下信息: * <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" 顺便了解下下面这句啦,哈哈,激动,是设置我们的应用默认安装的位置:自动、手机内存、SD卡 android:installLocation=["auto" | "internalOnly" | "preferExternal"] > . . . </manifest> * 跟进版本versionCode与versionNames可查看限制: * 再次强调一下,看到英文不要怕,不懂了用工具查,提高编程提高英文水平 * versionCode中此句最重要: * The value must be set as an integer, such as "100" * versionName也只看一句: * The version number shown to users. * */ try { //取得当前应用的包 String packageName = getPackageName(); //根据包名取得当前应用的版本号 int myVersion = getPackageManager().getPackageInfo(packageName, 0).versionCode; /** * 取服务器上的新版本文件版本号与当前应用的版本比较,如果当前版本低于服务器时弹出更新提示如下, * 访问服务器这步小马跳过,因为今天这个试例讲解广播实现版本更新嘛,通常使用webservice访问服务器 * 朋友们可以把访问服务器的代码直接写到这个地方进行版本比对哦 */ showAlertDialog(); } catch (NameNotFoundException e) { e.printStackTrace(); } } }); } //版本更新弹出对话框 private void showAlertDialog(){ Dialog dialog = new AlertDialog.Builder(this) .setTitle("新版本提示") .setMessage("发现新版本,是否需要升!") .setPositiveButton("确定",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int whichButton) { //下载服务控制 downloadService(); }}).setNegativeButton("取消", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create(); dialog.show(); } private void downloadService(){ String PathName = "从服务器取到的完整的路径如:http://www.google.cn/webhp?source=g_cn/XXX.apk"; Intent intent = new Intent(); intent.putExtra("URL", "访问服务器的URL"); intent.putExtra("Path", PathName); //记得在全局配置中注册DownloadService服务 intent.setClass(this, DownloadService.class); /** * 因为是这种方式启动的service,小马就在此插张图,供朋友们理解在DownloadService.class里面 * 小马为什么把处理过程写在onStart()中而不是onBind()中。 */ startService(intent); } }
下面来看下后台服务下载的代码:
package com.xiaoma.www; import java.io.File; import java.io.InputStream; import com.xiaoma.utils.FileUtils; import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; /** * @Title: DownloadService.java * @Package com.xiaoma.www * @Description: 启用后台下载新版本控制类 * @author MZH */ public class DownloadService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startId) { if(intent != null){ String urlStr = intent.getStringExtra("URL"); String fullPathName = intent.getStringExtra("Path"); DownloadThread downloadThread = new DownloadThread(urlStr, fullPathName); Thread thread = new Thread(downloadThread); thread.start(); } super.onStart(intent, startId); } class DownloadThread implements Runnable{ private String mUrl = null; private String mPathName = null; public DownloadThread(String aUrl, String PathName){ mUrl = aUrl; mPathName = PathName; } @Override public void run() { int result = downFile(mUrl, mPathName); Intent intent = new Intent("com.xiaoma.comeon"); Bundle bundle = new Bundle(); if( -1 == result){ bundle.putString("Status", "error"); }else { bundle.putString("Status", "success"); bundle.putString("Path", mPathName); } intent.putExtras(bundle); sendBroadcast(intent); } } public int downFile(String urlStr, String fullPathName){ InputStream inputStream = null; try{ File file = new File(fullPathName); if (file.exists()){ return 1; }else{ FileUtils fu = new FileUtils(); inputStream = fu.getStreamFromUrl(/blog_article/urlStr/index.html); File f = fu.writeInput(fullPathName, inputStream); if (f == null){ return -1; } } }catch(Exception e){ e.printStackTrace(); return -1; }finally{ try{ inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } return 0; } }
以下是后台下载时用到的文件工具类代码:
package com.xiaoma.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * @Title: DeleteFile.java * @Description: 文件、文件夹操作类 * @author MZH */ public class FileUtils{ private URL url = null ; public FileUtils(){ } public File writeInput(String PathName, InputStream input){ File file = null; OutputStream output = null; try{ file = new File( PathName ); if (file.exists()) return file; int length = 0; output = new FileOutputStream(file); byte buffer[] = new byte[1024]; while((length = input.read(buffer)) > 0){ output.write(buffer, 0, length); } }catch(Exception e){ e.printStackTrace(); }finally{ try{ output.close(); }catch(Exception e){ e.printStackTrace(); } } return file; } public InputStream getStreamFromUrl(/blog_article/String urlStr/index.html) throws MalformedURLException, IOException { url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConn.getInputStream(); return inputStream; } }
[3] 照相机的简单调用Demo
来源: 互联网 发布时间: 2014-02-18
相机的简单调用Demo
主类:
Base64Coder.java
配置文件:
主类:
package com.mzh.www; import java.io.ByteArrayOutputStream; import java.io.File; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; /** * @Title: CameraTestActivity.java * @Package com.lvguo.www * @Description: 相机测试 * @author MZH * @version V2.2 老样子,写个自己喜欢的版本号,方便日后维护 */ public class CameraTestActivity extends Activity { private Button btn ; private static final String IMAGE_UNSPECIFIED = "image/*"; String kkk = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //第一次看见这个类,不认识,直接Android Developer里面Search //小x英文不是很好,时刻在电脑上挂着词典,也希望朋友们能准备一款自己喜爱的词典 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //参数可直接在官方文档里面查到,所以朋友们练下手吧,自己查下EXTRA_OUTPUT intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri .fromFile(new File(Environment .getExternalStorageDirectory(), "mzh.jpg")));//temp为保存照片的文件名 //此处讲几句,类似这些方法,小x建议直接在浏览器下查,因为文档查不到就说没查到, //有网情况下,会自动定位到Activity | Android Developers直接点就OK了 startActivityForResult(intent, 1); //这是个好东西哦 Toast.makeText(getApplicationContext(), "点击拍照", Toast.LENGTH_LONG).show(); } }); } /** * 用来处理startActivityForResult返回的数据,查此方法用老办法 :直接在浏览器下查 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 9) { //此处的数字自己定,可随便 Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); //英语不好的朋友,拿工具查compress是什么意思就明白了,小x英语一般,所以此处多说一句,工具 photo.compress(Bitmap.CompressFormat.JPEG, 60, stream); byte[] b = stream.toByteArray(); //Base64Coder是一个剪切压缩辅助类,里面的东西我也看不懂,不过没事,直接用,因为要用的方法不多,情况具体定 kkk = new String(Base64Coder.encodeLines(b)); } } if(requestCode == 1){ File picture = new File(Environment.getExternalStorageDirectory() + "/mzh.jpg"); cutPic(Uri.fromFile(picture)); } super.onActivityResult(requestCode, resultCode, data); } public void cutPic(Uri uri) { //下面这一句第一眼看到我不懂,没事,直接Android Developer里面Search Intent //熟悉下面Summary吗?用工具查什么意思,再找下它是什么地方的,是官方文档最右侧顶端 的东西,里面有个Ctros,点进去 //Summary: Nested Classes | Constants | Inherited Constants | Fields //| Ctors | Methods | Inherited Methods | [Expand All] //会发现有个构造方法:Intent(String action)。。。。再点进去,贴官方代码: /** * public Intent (String action) Since: API Level 1 Create an intent with a given action. All other fields (data, type, class) are null. Note that the action must be in a namespace because Intents are used globally in the system -- for example the system VIEW action is android.intent.action.VIEW; an application's custom action would be something like com.google.app.myapp.CUSTOM_ACTION. Parameters <看到这句了吧?ACTION_VIEW,不知道的可以再Search> action The Intent action, such as ACTION_VIEW. 要再不明白的朋友可以直接在有网情况下直接把com.android.camera.action.CROP Search一下就OK了, 小x查询文档的能力不强,所以在查询这块多说几句 */ Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, 9); } }
Base64Coder.java
package com.mzh.www; //Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland //www.source-code.biz, www.inventec.ch/chdh // //This module is multi-licensed and may be used under the terms //of any of the following licenses: // //EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal //LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html //GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html //AL, Apache License, V2.0 or later, http://www.apache.org/licenses //BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php // //Please contact the author if you need another license. //This module is provided "as is", without warranties of any kind. /** * A Base64 encoder/decoder. * * <p> * This class is used to encode and decode data in Base64 format as described in RFC 1521. * * <p> * Project home page: <a href="http://www.source-code.biz/base64coder/java/">www.source-code.biz/base64coder/java</a><br> * Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br> * Multi-licensed: EPL / LGPL / GPL / AL / BSD. */ public class Base64Coder { //The line separator string of the operating system. private static final String systemLineSeparator = System.getProperty("line.separator"); //Mapping table from 6-bit nibbles to Base64 characters. private static char[] map1 = new char[64]; static { int i=0; for (char c='A'; c<='Z'; c++) map1[i++] = c; for (char c='a'; c<='z'; c++) map1[i++] = c; for (char c='0'; c<='9'; c++) map1[i++] = c; map1[i++] = '+'; map1[i++] = '/'; } //Mapping table from Base64 characters to 6-bit nibbles. private static byte[] map2 = new byte[128]; static { for (int i=0; i<map2.length; i++) map2[i] = -1; for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; } /** * Encodes a string into Base64 format. * No blanks or line breaks are inserted. * @param s A String to be encoded. * @return A String containing the Base64 encoded data. */ public static String encodeString (String s) { return new String(encode(s.getBytes())); } /** * Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters. * This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>. * @param in An array containing the data bytes to be encoded. * @return A String containing the Base64 encoded data, broken into lines. */ public static String encodeLines (byte[] in) { return encodeLines(in, 0, in.length, 76, systemLineSeparator); } /** * Encodes a byte array into Base 64 format and breaks the output into lines. * @param in An array containing the data bytes to be encoded. * @param iOff Offset of the first byte in <code>in</code> to be processed. * @param iLen Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>. * @param lineLen Line length for the output data. Should be a multiple of 4. * @param lineSeparator The line separator to be used to separate the output lines. * @return A String containing the Base64 encoded data, broken into lines. */ public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) { int blockLen = (lineLen*3) / 4; if (blockLen <= 0) throw new IllegalArgumentException(); int lines = (iLen+blockLen-1) / blockLen; int bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length(); StringBuilder buf = new StringBuilder(bufLen); int ip = 0; while (ip < iLen) { int l = Math.min(iLen-ip, blockLen); buf.append (encode(in, iOff+ip, l)); buf.append (lineSeparator); ip += l; } return buf.toString(); } /** * Encodes a byte array into Base64 format. * No blanks or line breaks are inserted in the output. * @param in An array containing the data bytes to be encoded. * @return A character array containing the Base64 encoded data. */ public static char[] encode (byte[] in) { return encode(in, 0, in.length); } /** * Encodes a byte array into Base64 format. * No blanks or line breaks are inserted in the output. * @param in An array containing the data bytes to be encoded. * @param iLen Number of bytes to process in <code>in</code>. * @return A character array containing the Base64 encoded data. */ public static char[] encode (byte[] in, int iLen) { return encode(in, 0, iLen); } /** * Encodes a byte array into Base64 format. * No blanks or line breaks are inserted in the output. * @param in An array containing the data bytes to be encoded. * @param iOff Offset of the first byte in <code>in</code> to be processed. * @param iLen Number of bytes to process in <code>in</code>, starting at <code>iOff</code>. * @return A character array containing the Base64 encoded data. */ public static char[] encode (byte[] in, int iOff, int iLen) { int oDataLen = (iLen*4+2)/3; // output length without padding int oLen = ((iLen+2)/3)*4; // output length including padding char[] out = new char[oLen]; int ip = iOff; int iEnd = iOff + iLen; int op = 0; while (ip < iEnd) { int i0 = in[ip++] & 0xff; int i1 = ip < iEnd ? in[ip++] & 0xff : 0; int i2 = ip < iEnd ? in[ip++] & 0xff : 0; int o0 = i0 >>> 2; int o1 = ((i0 & 3) << 4) | (i1 >>> 4); int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); int o3 = i2 & 0x3F; out[op++] = map1[o0]; out[op++] = map1[o1]; out[op] = op < oDataLen ? map1[o2] : '='; op++; out[op] = op < oDataLen ? map1[o3] : '='; op++; } return out; } /** * Decodes a string from Base64 format. * No blanks or line breaks are allowed within the Base64 encoded input data. * @param s A Base64 String to be decoded. * @return A String containing the decoded data. * @throws IllegalArgumentException If the input is not valid Base64 encoded data. */ public static String decodeString (String s) { return new String(decode(s)); } /** * Decodes a byte array from Base64 format and ignores line separators, tabs and blanks. * CR, LF, Tab and Space characters are ignored in the input data. * This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>. * @param s A Base64 String to be decoded. * @return An array containing the decoded data bytes. * @throws IllegalArgumentException If the input is not valid Base64 encoded data. */ public static byte[] decodeLines (String s) { char[] buf = new char[s.length()+3]; int p = 0; for (int ip = 0; ip < s.length(); ip++) { char c = s.charAt(ip); if (c != ' ' && c != '\r' && c != '\n' && c != '\t') buf[p++] = c; } while ((p % 4) != 0) buf[p++] = '0'; return decode(buf, 0, p); } /** * Decodes a byte array from Base64 format. * No blanks or line breaks are allowed within the Base64 encoded input data. * @param s A Base64 String to be decoded. * @return An array containing the decoded data bytes. * @throws IllegalArgumentException If the input is not valid Base64 encoded data. */ public static byte[] decode (String s) { return decode(s.toCharArray()); } /** * Decodes a byte array from Base64 format. * No blanks or line breaks are allowed within the Base64 encoded input data. * @param in A character array containing the Base64 encoded data. * @return An array containing the decoded data bytes. * @throws IllegalArgumentException If the input is not valid Base64 encoded data. */ public static byte[] decode (char[] in) { return decode(in, 0, in.length); } /** * Decodes a byte array from Base64 format. * No blanks or line breaks are allowed within the Base64 encoded input data. * @param in A character array containing the Base64 encoded data. * @param iOff Offset of the first character in <code>in</code> to be processed. * @param iLen Number of characters to process in <code>in</code>, starting at <code>iOff</code>. * @return An array containing the decoded data bytes. * @throws IllegalArgumentException If the input is not valid Base64 encoded data. */ public static byte[] decode (char[] in, int iOff, int iLen) { if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4."); while (iLen > 0 && in[iOff+iLen-1] == '=') iLen--; int oLen = (iLen*3) / 4; byte[] out = new byte[oLen]; int ip = iOff; int iEnd = iOff + iLen; int op = 0; while (ip < iEnd) { int i0 = in[ip++]; int i1 = in[ip++]; int i2 = ip < iEnd ? in[ip++] : 'A'; int i3 = ip < iEnd ? in[ip++] : 'A'; if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) throw new IllegalArgumentException ("Illegal character in Base64 encoded data."); int b0 = map2[i0]; int b1 = map2[i1]; int b2 = map2[i2]; int b3 = map2[i3]; if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) throw new IllegalArgumentException ("Illegal character in Base64 encoded data."); int o0 = ( b0 <<2) | (b1>>>4); int o1 = ((b1 & 0xf)<<4) | (b2>>>2); int o2 = ((b2 & 3)<<6) | b3; out[op++] = (byte)o0; if (op<oLen) out[op++] = (byte)o1; if (op<oLen) out[op++] = (byte)o2; } return out; } //Dummy constructor. private Base64Coder() {} } // end class Base64Coder
配置文件:
<?xml version="1.0" encoding="utf-8" ?> - <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mzh.www" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> - <application android:icon="@drawable/icon" android:label="@string/app_name"> - <activity android:name=".CameraTestActivity" android:label="@string/app_name"> - <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> - <!-- 相机使用权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> </manifest>
最新技术文章: