安卓取图片(一)进入相机

Section1  简单代码

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    doGetImageFromCamera();
}
private void doGetImageFromCamera() {
    //1 new Intent with Action
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //2 set output Uri
    Uri imageUri = setOutputFileUri();
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    //3 startActivityForResult
    startActivityForResult(cameraIntent, 10000);
}
public Uri setOutputFileUri() {
    String imagePath = getImagePath("haha");
    File file = new File(imagePath);
    return Uri.fromFile(file);
}
public static String getImagePath(String name) {
    String filePath = Environment.getExternalStorageDirectory()
            + File.separator + "tempPath" + File.separator + name;
    return filePath;
}

我们 1.new 了一个intent,
     2.设置好拍照的output Uri,
     3.startActivityForResult
 结果报如下错误,
 android.os.FileUriExposedException: file:///storage/emulated/0/tempPath/haha exposed beyond app through ClipData.Item.getUri()
 
查资料可知,
这是因为谷歌在targetSdkVersion为 android N(7.0 api24)
的情况下作了权限的限制。
 
解决方案1:把targetSdkVersion 降为23
解决方案2:通过FileProvider 的方式来解决
解决方案3:使用ContentProvider方式传递uri
 
我们选择方案3
 
Section 2  ContentProvider 传递uri
修改后的代码如下
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    doGetImageFromCamera();
}
private void doGetImageFromCamera() {
    //1 new Intent with Action
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //2 set output Uri
    Uri imageUri = setOutputFileUri();
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    //3 startActivityForResult
    startActivityForResult(cameraIntent, 10000);
}
public Uri setOutputFileUri() {
    String imagePath = getImagePath("haha");
    ContentValues contentValues = new ContentValues(1);
    contentValues.put(MediaStore.Images.Media.DATA, imagePath);
    return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
}
public static String getImagePath(String name) {
    String filePath = Environment.getExternalStorageDirectory()
            + File.separator + "tempPath" + File.separator + name;
    return filePath;
}
报错如下
 java.lang.SecurityException: Permission Denial: 
writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=13656, uid=10227 
requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
 
缺少权限
 
Section3 
添加   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 权限
现在,我们终于可以进入相机界面了。。

                                                                         
 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值