添加知乎图片图片框架依赖: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() {
}
});
}