`

调用摄像机和相册

 
阅读更多

调用摄像机

目标: 调用摄像机,并将结果显示在界面上

 

步骤:

1.声明一个图片资源路径

 

private Uri imageUri;

2.在layout.xml中创建一个ImageView,用来显示图片,并在AndroidManifest.xml中申请sdcard权限,用于保存拍摄的照片

    

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

3.在onCreate()中创建一个图片文件,并获取路径

imageView=(ImageView)findViewById(R.id.imageView);
imageUri=Uri.fromFile(new File(getExternalCacheDir(),"test.jpg"));

 

4.在按钮的点击事件中,启动摄像机,并保存拍摄结果

Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
   intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
   startActivityForResult(intent,1);

 

5.在onActivityResult回调方法中,将照片显示出来

 

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        //将.jpg解析成bitmap对象
        Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
        imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

 

调用相册

1.因为图片在sdcard中,所以要申请权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

2.在主线程中启动相册

Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, 1); // 打开相册

 

3.如果要在相册选择图片,并显示在ImageView上

    在4.4以下系统,使用以下代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    handleImageBeforeKitKat(data);

}


private void handleImageBeforeKitKat(Intent data) {
    Uri uri = data.getData();
    String imagePath = getImagePath(uri, null);
    displayImage(imagePath);
}

private String getImagePath(Uri uri, String selection) {
    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(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }
    return path;
}

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

 

   在4.4以上系统,使用以下代码

private void handleImageOnKitKat(Intent data) {
    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())) {
        // 如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(uri, null);
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        // 如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
    }
    displayImage(imagePath); // 根据图片路径显示图片
}

private String getImagePath(Uri uri, String selection) {
    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(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }
    return path;
}

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics