android 10 系统获取图片权限问题(BitmapFactory.decodeFile获取Bitmap为空)

在android 6.0以后,权限不止是在AndroidManifest.xml文件里面声明,而且需要在代码中动态获取,这一点大部分人应该都很清楚了,如果不清楚,可以看下面代码(这里以读写文件和相机权限为例): 

// 准备申请的权限
private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, 
                                Manifest.permission.CAMERA};

private static final int REQUEST_CODE = 10001;
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    // 检查该权限是否已经获取

    for (String permission : permissions) {
        //  GRANTED---授权  DINIED---拒绝
        if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) == PackageManager.DINIED) {
            ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
        }
    }
}

用以上代码去申请权限。

在最近的开发过程中,发现在华为P30等手机上,调用系统获取图片或者是拍照获取图片时候获取不到,通过以下方法获得图片的Bitmap时为空:

Bitmap bitmap1 = BitmapFactory.decodeFile(outputFile.getAbsolutePath());

然后通过另外方式获取Bitmap

               byte[] bytes = new byte[(int) outputFile.length() + 1];
               FileInputStream inputStream = null;
                try {
                    inputStream = new FileInputStream(outputFile.getAbsoluteFile());
                    inputStream.read(bytes);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    LogUtils.e("test", " FileNotFoundException e " + e.toString());
                } catch (IOException e) {
                    LogUtils.e("test", " IOException e " + e.toString());
                }
                bitmap1 = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

 

结果Catch 到 FileNotFoundException e java.io.FileNotFoundException: /storage/emulated/0/Pictures/xxxxx.jpg: open failed: EACCES (Permission denied)

没有权限,但上面明明已经申请权限,且已经手动赋予权限。在手机设置里面的App权限管理里面找到对应App,发现确实是有存储权限的,实在是不放心,又在代码里打印出来,确认App有读写存储权限:


    boolean permission_readStorage = (PackageManager.PERMISSION_GRANTED == 
activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
    boolean permission_writeStorage = (PackageManager.PERMISSION_GRANTED ==
activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE));

打印出来,都有权限,更百思不得其解,继续找相关资料,发现在android 10系统中 

需要在文件下AndroidManifest.xml 加上android:requestLegacyExternalStorage = “true” 这个属性

<application android:requestLegacyExternalStorage = “true”>

然后试验,发现可以成功读取文件了,问题解决。

关于android 10 (Android Q) 版本具体的系统分区权限及适配,可以参考下面文章:

Android Q分区存储权限变更及适配

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: BitmapFactory.decodeFile是一个Android中的方法,用于从指定的文件路径中解码并创建一个Bitmap对象。它可以将图片文件转换为Bitmap对象,方便在应用程序中进行显示和处理。 ### 回答2: BitmapFactory.decodeFile()是Android平台中的一个API,用于将一个文件路径转换成Bitmap对象。 在Android应用程序中,若需要将本地文件存储到内存中,并进一步处理和展示,就需要使用到BitmapFactory.decodeFile()方法。这里“本地文件”可以是一张图片、一份文档等文件。 BitmapFactory.decodeFile()的使用需要指定图片的文件路径,示例代码如下: ``` // 指定图片路径 String filePath = "path_to_image_file"; // 通过BitmapFactory.decodeFile()方法将文件转换成Bitmap对象 Bitmap bitmap = BitmapFactory.decodeFile(filePath); // 将Bitmap对象显示到ImageView控件中 ImageView imageView = findViewById(R.id.image_view); imageView.setImageBitmap(bitmap); ``` BitmapFactory.decodeFile()方法还可以传入一个可选参数options,该参数可以用来控制图片的采样率、缩放比例等参数,从而减少内存占用。示例代码如下: ``` // 指定图片路径 String filePath = "path_to_image_file"; // 设置options参数 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; // 通过BitmapFactory.decodeFile()方法将文件转换成Bitmap对象 Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); // 将Bitmap对象显示到ImageView控件中 ImageView imageView = findViewById(R.id.image_view); imageView.setImageBitmap(bitmap); ``` 总体来说,BitmapFactory.decodeFile()方法是Android平台中非常常用的一个API,能够帮助开发者将本地文件转换成Bitmap对象,方便进一步处理和展示。在使用前需要仔细考虑内存使用情况,以避免内存泄漏和OutOfMemoryError等问题。 ### 回答3: BitmapFactory.decodeFile是一个Android系统中的用于读取图片文件并转成Bitmap类型的方法。它可以读取本地文件或者SD卡中的图片文件,并将其转换成Bitmap对象。使用时需要传入图片文件的路径,并可以选择对图片进行一些参数设置,如图片压缩、缩放、裁剪等操作。 BitmapFactory.decodeFile返回的是一个Bitmap对象,表示读取的图片。如果读取失败,则返回null。当该方法读取的图片过大时,可能会导致内存溢出等异常。针对这种情况,可以使用BitmapFactory.Options类来进行参数设置,如inSampleSize参数对图片进行缩放,减小图片内存占用。 在使用BitmapFactory.decodeFile时,需要注意以下几点:图片文件的格式必须支持,如jpg、png、bmp等;要读取的图片必须存在且具有可读取的权限;读取大型图片时,需要适当处理,避免OOM等异常;读取完毕后需要回收Bitmap对象。 总之,BitmapFactory.decodeFile这个方法在Android开发中十分常用,我们可以使用它来读取本地图片,显示在我们的应用程序中,或者对得到的Bitmap对象进行一些操作以满足我们的需要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值