关于安卓的java.lang.NullPointerException: Attempt to get length of null array

这个一般是内存没有读到,导致读不了SD卡的内容,也无法写进去。
图片文字都是不行的。

一个治标不治本的方法
参考:https://blog.csdn.net/tangbin0505/article/details/93339111?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

加入前半句不为空的判断,因为是空的话求leng直接会报错

if(array != null && array.leng != 0)
{
//数据不为空数据的判断。
}

但是这个方法不好,本质上只是不报错了,写和读还是没有成功。

我们需要加入读写权限
参考:https://blog.csdn.net/whuzhang16/article/details/73302167/
在Android中,涉及到读写SD卡上的文件时,有时会出现java.lang.NullPointerException: Attempt to get length of null array错误。这种现象很有可能是因为在清单文件AndroidManifest.xml文件中没有添加读写SD卡的权限。加上这两句就可以了。

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

但是在我这里还是不行
还得写用动态申请的方法

方法一:
写个checkPermission直接调用

checkPermission(Login.this);
    private void checkPermission(Activity activity) {//开启本地的照片读取与写入权限
        // Storage Permissions
        final int REQUEST_EXTERNAL_STORAGE = 1;
        String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,//读内存权限
                Manifest.permission.WRITE_EXTERNAL_STORAGE};//写内存权限

        try {
            //检测是否有写的权限
            int permission = ActivityCompat.checkSelfPermission(Login.this,
                    "android.permission.WRITE_EXTERNAL_STORAGE");
            if (permission != PackageManager.PERMISSION_GRANTED) {
                // 没有写的权限,去申请写的权限,会弹出对话框
                ActivityCompat.requestPermissions(Login.this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
            }

            if(ContextCompat.checkSelfPermission(Login.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(Login.this,new String[]{Manifest.permission.CALL_PHONE},1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

方法二:
动态直接申请,这里的WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE这些权限名字可以去查官方的权限表格得到。

        if(ContextCompat.checkSelfPermission(Login.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(Login.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        }
        if(ContextCompat.checkSelfPermission(Login.this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(Login.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
        }

然后发现还是不行,原因是安卓10和安卓9有区别
参考:https://blog.csdn.net/u013718730/article/details/104693746/
Android10对权限的管理更加严格了,主要有以下两点
权限按单个分配,不再按组分配,以前申请了读存储卡权限,即可获得同组的写权限,现在需要逐个申请
存储卡读写权限需要在Application的Manifest清单中声明加入下面这句话

	<application
		android:requestLegacyExternalStorage="true">
	</application>

在这里插入图片描述
之后在安卓10手机就不会出现闪退情况了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值