解决采用知乎图片上传框架Matisse上传图片时候,点击拍照闪退的一个小bug和android7.0以上的机型调用系统相机的权限处理

添加知乎图片图片框架依赖:implementation 'com.zhihu.android:matisse:0.5.1'

问题描述:

Stack trace:  
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
 at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:604)
 at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:578)
 at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:416)
 at com.zhihu.matisse.internal.utils.MediaStoreCompat.dispatchCaptureIntent(MediaStoreCompat.java:86)
 at com.zhihu.matisse.ui.MatisseActivity.capture(MatisseActivity.java:424)
 at com.zhihu.matisse.internal.ui.adapter.AlbumMediaAdapter$1.onClick(AlbumMediaAdapter.java:75)
 at android.view.View.performClick(View.java:6614)
 at android.view.View.performClickInternal(View.java:6591)
 at android.view.View.access$3100(View.java:786)
 at android.view.View$PerformClick.run(View.java:25948)
 at android.os.Handler.handleCallback(Handler.java:873)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:201)
 at android.app.ActivityThread.main(ActivityThread.java:6806)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

一开始有点蒙,不知道哪里出错了,后来检查发现provider里的android:authorities属性错了。将代码里的修改问题立即解决。

    <provider 
                   android:label="TextProvider"
                   android:name="Android_TextProvider"
                   android:authorities="com.huawei.tenAndroid.Android_TextProvider">
        </provider>如上,label,name 随意,写provider的定义的名称即可。
      authorities 是provider所在的包的名字+provider本身定义的名称

 

开始点击拍照,又报下面错误。

Stack trace:  
java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.huawei.camera/.ThirdCamera clip={text/uri-list U:content://com.nzmservice.dragonserapp.fileprovider/my_images/JPEG_20190927_103318.jpg} (has extras) } from ProcessRecord{374f8d0 28917:com.nzmservice.dragonserapp/u0a302} (pid=28917, uid=10302) with revoked permission android.permission.CAMERA
 at android.os.Parcel.createException(Parcel.java:1953)
 at android.os.Parcel.readException(Parcel.java:1921)
 at android.os.Parcel.readException(Parcel.java:1871)
 at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3733)
 at android.app.Instrumentation.execStartActivity(Instrumentation.java:1753)
 at android.app.Activity.startActivityForResult(Activity.java:4803)
 at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
 at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
 at android.app.Activity.startActivityForResult(Activity.java:4743)
 at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
 at com.zhihu.matisse.internal.utils.MediaStoreCompat.dispatchCaptureIntent(MediaStoreCompat.java:102)
 at com.zhihu.matisse.ui.MatisseActivity.capture(MatisseActivity.java:424)
 at com.zhihu.matisse.internal.ui.adapter.AlbumMediaAdapter$1.onClick(AlbumMediaAdapter.java:75)
 at android.view.View.performClick(View.java:6663)
 at android.view.View.performClickInternal(View.java:6635)
 at android.view.View.access$3100(View.java:794)
 at android.view.View$PerformClick.run(View.java:26199)
 at android.os.Handler.handleCallback(Handler.java:907)
 at android.os.Handler.dispatchMessage(Handler.java:105)
 at android.os.Looper.loop(Looper.java:216)
 at android.app.ActivityThread.main(ActivityThread.java:7625)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: android.os.RemoteException: Remote stack trace:

这是因为没有权限。下面我给出一个快速解决权限问题的框架,很好的处理了android6.0,7.0以上的动态权限

添加依赖:implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'

在拍照View的点击事件中调用下面这个方法,可以动态的设置权限。

private void getPermissions() {


    RxPermissions rxPermissions = new RxPermissions(this);
    rxPermissions.request(Manifest.permission.CAMERA)
            .subscribe(new io.reactivex.Observer<Boolean>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Boolean aBoolean) {
                    if (aBoolean) {
                        selectImage();
                    } else {
                        ToastUtil.showShort(AddTypeActivity.this , "获取权限失败,请重新授权");
                    }
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值