Android 调用相机、相册功能

我的未来我决定 提交于 2019-11-28 03:31:58

 

  清单文件中增加对应权限,动态申请权限(此部分请参考Android 动态申请权限,在此不作为重点描述)

private static final int REQUEST_CODE_ALBUM = 100;//打开相册private static final int REQUEST_CODE_CAMERA = 101;//打开相机
//调用相册private void openAlbum(){    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);    intent.setType("image/*");    startActivityForResult(intent, REQUEST_CODE_ALBUM);}
//调用相机private void openCamera1(){    Intent intent;    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    startActivityForResult(intent, REQUEST_CODE_CAMERA);}
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if(requestCode == REQUEST_CODE_ALBUM && resultCode == RESULT_OK){        if (data != null) {            // 照片的原始资源地址            Uri uri = data.getData();            String path = uri.getPath();            ContentResolver cr = context.getContentResolver();            try {                Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));                /* 将Bitmap设定到ImageView */                imageView.setImageBitmap(bitmap);            } catch (FileNotFoundException e) {                Log.e("Exception", e.getMessage(), e);            }
        }    }else if(requestCode == REQUEST_CODE_CAMERA && resultCode == RESULT_OK){        if(data != null && data.getData() != null){            Bundle extras = data.getExtras();            if (extras != null) {                Bitmap bitmap = extras.getParcelable("data");                /* 将Bitmap设定到ImageView */                imageView.setImageBitmap(bitmap);          //可将图片保存下来,用于上传或其他操作(如果不需要可以省略此步)          String path = savePicToSdcard(image,Environment.getExternalStorageDirectory().getPath(),System.currentTimeMillis() + ".jpg");
            }        }    }}
public static String savePicToSdcard(Bitmap bitmap, String path, String fileName) {    String filePath = "";    if (bitmap != null) {        filePath = path + File.separator + fileName;        File destFile = new File(filePath);        OutputStream os = null;        try {            os = new FileOutputStream(destFile);            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);            os.flush();            os.close();        } catch (IOException e) {            filePath = "";        }    }    return filePath;}
上述相机方法相片清晰度低,获取的是返回对象中的略缩图;如对照片清晰度有要求,可以在上面方法的基础上进行修改,方法如下:需要在清单文件中application中增加如下代码:
<provider    android:name="android.support.v4.content.FileProvider"    android:authorities="${applicationId}.fileprovider"    android:exported="false"    android:grantUriPermissions="true">    <meta-data        android:name="android.support.FILE_PROVIDER_PATHS"        android:resource="@xml/file_paths" /></provider>创建file_paths.xml文件项目目录res下创建xml文件夹,xml文件夹下创建file_paths.xml文件,文件内容:
<?xml version="1.0" encoding="utf-8"?><paths>    <external-path        name="external_storage_root"        path="." /></paths>配置完成后,修改增加如下代码:
private static final int REQUEST_RESULT_CODE = 102;//裁剪后保存
//调用相机(指定相机拍摄照片保存地址,相片清晰度高)private void openCamera2(){    String photoPath = Environment.getExternalStorageDirectory().getPath()+"/"+File.separator+"123.jpg";    File pictureFile = new File(photoPath);    Uri picUri;    Intent intent;    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        String packageName = context.getApplicationContext().getPackageName();        picUri = FileProvider.getUriForFile(context, new StringBuilder(packageName).append(".fileprovider").toString(), pictureFile);    } else {        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);        picUri = Uri.fromFile(pictureFile);    }    intent.putExtra(MediaStore.EXTRA_OUTPUT, picUri);    startActivityForResult(intent, REQUEST_CODE_CAMERA);}
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if(requestCode == REQUEST_CODE_ALBUM && resultCode == RESULT_OK){        if (data != null) {            // 照片的原始资源地址            Uri uri = data.getData();            String path = uri.getPath();            ContentResolver cr = context.getContentResolver();            try {                Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));                /* 将Bitmap设定到ImageView */                imageView.setImageBitmap(bitmap);            } catch (FileNotFoundException e) {                Log.e("Exception", e.getMessage(), e);            }        }    }else if(requestCode == REQUEST_CODE_CAMERA && resultCode == RESULT_OK){        File tempFile = new File(photoPath);        cropImg(getImageContentUri(tempFile));//对照片进行裁剪保存    }else if(requestCode ==REQUEST_RESULT_CODE && resultCode == RESULT_OK){        try {            Bitmap image = BitmapFactory.decodeStream(getContentResolver().openInputStream(mUriPath));            /* 将Bitmap设定到ImageView */            imageView.setImageBitmap(bitmap);        } catch (FileNotFoundException e) {            e.printStackTrace();        }    }}
public Uri getImageContentUri(File imageFile) {
    String filePath = imageFile.getAbsolutePath();    Cursor cursor = getContentResolver().query(            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,            new String[]{MediaStore.Images.Media._ID},            MediaStore.Images.Media.DATA + "=? ",            new String[]{filePath}, null);    if (cursor != null && cursor.moveToFirst()) {        int id = cursor.getInt(cursor                .getColumnIndex(MediaStore.MediaColumns._ID));        Uri baseUri = Uri.parse("content://media/external/images/media");        return Uri.withAppendedPath(baseUri, "" + id);    } else {        if (imageFile.exists()) {            ContentValues values = new ContentValues();            values.put(MediaStore.Images.Media.DATA, filePath);            return getContentResolver().insert(                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);        } else {            return null;        }    }}public void cropImg(Uri uri){
    Intent intent = new Intent("com.android.camera.action.CROP");    intent.setDataAndType(uri, "image/*");    //实现对图片的裁剪,必须要设置图片的属性和大小    intent.putExtra("crop", "true");  //滑动选中图片区域    intent.putExtra("aspectX", 1);  //裁剪框比例1:1    intent.putExtra("aspectY", 1);    intent.putExtra("outputX", 700);  //输出图片大小    intent.putExtra("outputY", 700);    intent.putExtra("return-data", true);  //有返回值    String mLinshi = System.currentTimeMillis() + ".jpg";    photoFile = new File(Environment.getExternalStorageDirectory().getPath(), mLinshi);    mUriPath = Uri.parse("file://" + photoFile.getAbsolutePath());    //将裁剪好的图输出到所建文件中    intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriPath);    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());    //注意:此处应设置return-data为false,如果设置为true,是直接返回bitmap格式的数据,耗费内存。设置为false,然后,设置裁剪完之后保存的路径,即:intent.putExtra(MediaStore.EXTRA_OUTPUT, uriPath);    intent.putExtra("return-data", false);    startActivityForResult(intent, REQUEST_RESULT_CODE);}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!