以前做项目为了省事,我都是将sdk版本写成22.这样还不用写权限申请,省时省力。然这不是长久之计,android7.0出来后,就想着闲暇时写一个小DOME,做一下权限适配
第一个想到的权限就是相机权限,平常我们上传头像跟二维码扫描经常用到。但是在7.0的手机上调用相机是出现错误android.os.FileUriExposedException。这个需要在AndroidManifest。xml中声明权限
<provider android:name="android.support.v4.content.FileProvider" android:authorities="www.xcd.com.xcdgif.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
然后做一下版本判断
try { // 关闭对话框 closeChoiceDialog(); // 生成photoPath File photoFile = new File(YYStorageUtil.getImagePath(ChatActivity.this), UUID.randomUUID().toString() + ".jpg"); photoPath = photoFile.getPath(); //判断是否是AndroidN以及更高的版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) {//判断是否有相机应用 if (photoFile != null) { //FileProvider 是一个特殊的 ContentProvider 的子类, //它使用 content:// Uri 代替了 file:/// Uri. ,更便利而且安全的为另一个app分享文件 Uri photoURI = FileProvider.getUriForFile(this, "www.xcd.com.xcdgif.fileProvider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_CODE_HEAD_CAMERA); } } } else { // uri Uri photoUri = Uri.fromFile(new File(photoPath)); // 调用系统相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); cameraIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); // start ChatActivity.this.startActivityForResult(cameraIntent, REQUEST_CODE_HEAD_CAMERA); } } catch (Exception e) { e.printStackTrace(); }
到这里基本就完成了。但是我运行后却出现了错误
06-27 09:45:40.645 9613-9613/www.xcd.com.xcdgif I/HwPointEventFilter: do not support AFT because of no config 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: 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 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:583) 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557) 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:399) 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: at www.xcd.com.mylibrary.activity.ChatActivity.onClick(ChatActivity.java:87) 06-27 09:45:41.543 9613-9613/www.xcd.com.xcdgif W/System.err: at www.xcd.com.xcdgif.activity.MainActivity.onClick(MainActivity.java:38) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.view.View.performClick(View.java:5647) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.view.View$PerformClick.run(View.java:22465) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.os.Handler.handleCallback(Handler.java:761) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.os.Handler.dispatchMessage(Handler.java:98) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.os.Looper.loop(Looper.java:156) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6577) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at java.lang.reflect.Method.invoke(Native Method) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) 06-27 09:45:41.544 9613-9613/www.xcd.com.xcdgif W/System.err: at com.android.internal.os.ZygoteInit
竟然是一个空指针的异常,本想这个问题应该很简单,打印结果photoFile不是null。这个就比较蛋疼了
调试好久才发现是因为AndroidManifest文件中定义的authorities跟代码中声明的authority不一样。
记录一下,特此谨记
附一下demo链接 http://download.csdn.net/detail/x158454996/9883943