1. 程式人生 > >讀書筆記1--android多媒體之手機拍照

讀書筆記1--android多媒體之手機拍照

android系統從4.4版本開始,選取相簿中的圖片不再返回圖片真實的Uri了,而是一個封裝過的Uri,因此如果是4.4版本以上的手機就需要對這個Uri進行解析才行。

android.media.action.IMAGE_CAPTURE//手機相機

com.android.camera.action.CROP//手機拍照

1)按鈕拍照事件

takephoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//建立File物件,用於儲存拍照後的照片
File outputImage=new File(Environment.getExternalStorageDirectory(),"output_image.jpg");
try {
if(outputImage.exists())
{
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
imageUri=Uri.fromFile(outputImage);//轉成url物件地址
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);//啟動相機程式

}
});

2)//根據返回的code判斷啟動哪種功能

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
{
case TAKE_PHOTO:
if(resultCode==RESULT_OK)
{
Intent intent=new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CROP_PHOTO);//啟動裁剪程式
}
break;
case CROP_PHOTO:

if(resultCode==RESULT_OK)
{
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
image.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
break;

//從相簿選取照片
case CHOOSE_PHOTO:
if(resultCode==RESULT_OK)
{
if(Build.VERSION.SDK_INT>=19)
{
//4.4及以上系統使用這個方法處理圖片
handleImageOnKitKat(data);
}else
{
//4.4及以下系統使用這個方法處理圖片
handleImageBeforeKitKat(data);
}
}
break;
default:
break; 
}
}

3)

1.//4.4以後的android版本

@TargetApi(19)
private void handleImageOnKitKat(Intent data) {
// TODO Auto-generated method stub
String imagePath=null;
Uri uri=data.getData();
if(DocumentsContract.isDocumentUri(this, uri))
{
//如果是document型別的uri,則通過document id處理
String docId=DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(
uri.getAuthority()))
{
String id=docId.split(":")[1];//解析出數字格式的id
String selection=MediaStore.Images.Media._ID+"="+id;
imagePath=getImagePath(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if("com.android.providers.downloads.documents".equals(uri.getAuthority()))
{
Uri contentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), 
Long.valueOf(docId));
imagePath=getImagePath(contentUri, null);
}
}else if("content".equalsIgnoreCase(uri.getScheme()))
{
//如果不是document型別的Uri,擇使用普通方式處理
imagePath=getImagePath(uri, null);
}

displayImage(imagePath);

}

2.//4.4之前的android版本

private void handleImageBeforeKitKat(Intent data) {
// TODO Auto-generated method stub
Uri uri=data.getData();
String imagePath=getImagePath(uri, null);
displayImage(imagePath);
}

4)獲取圖片的路徑

private String getImagePath(Uri uri, String selection) {
// TODO Auto-generated method stub
String path=null;
//通過uri和selection來獲取真實的圖片路徑
Cursor cursor=getContentResolver().query(uri, null, selection, null, null);
if(cursor!=null)
{
if(cursor.moveToFirst()){
path=cursor.getString(cursor.getColumnIndex(Media.DATA));
}
cursor.close();
}

return path;
}

5)用於顯示圖片的方法

private void displayImage(String imagePath) {
if(imagePath!=null)
{
Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
image.setImageBitmap(bitmap);
}else
{
Toast.makeText(this, "failed to get image", 2000).show();
}
}