在android6.0手机调用系统相机的时候,报如下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.doolii.shopping/cn.doolii.shopping.view.uploadImage.AlbumUploadActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/thumbnails from pid=27138, uid=10103 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2453)
在拍照的时候报如上问题,原因是没有添加相机权限<uses-permission android:name="android.permission.CAMERA" />
同时android6.0以上系统新出权限问题
解决方法如下:
一:定义常量
public final static int MY_PERMISSIONS_REQUEST_READ_CONTACTS=1;
二:
在调用需要权限的方法之前,如调用拍照之前先判断是否有权限.
调用如下方法:
- @TargetApi(Build.VERSION_CODES.M)
- private void getPermission() {
- if (ContextCompat.checkSelfPermission(UploadPicActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
-
- requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
- } else {
- photo();
- pop.dismiss();
- ll_popup.clearAnimation();
- }
- }
权限返回结果
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- switch (requestCode) {
- case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- photo();
- } else {
- Toast.makeText(UploadPicActivity.this, "请打开相机权限", Toast.LENGTH_LONG).show();
- }
- break;
- }
- }
工具类如下:
- <pre name="code" class="java">package cn.doolii.usershopping.utils;
-
- import android.Manifest;
- import android.annotation.TargetApi;
- import android.app.Activity;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.os.Build;
- import android.support.v4.app.ActivityCompat;
- import android.support.v4.app.Fragment;
- import android.support.v4.content.ContextCompat;
- import android.util.Log;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * Created by lzq on 2016/6/30.
- */
- public class PermissionUtils {
- static Activity context;
-
- public PermissionUtils(Activity context) {
- this.context=context;
- }
-
- public static final int MY_PERMISSIONS_REQUEST_CALL_PHONE=200;
- public static void needPermission(int requestCode)
- {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
- return;
- }
- requestAllPermissions(requestCode);
- }
- private static void requestAllPermissions( int requestCode)
- {
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.GET_ACCOUNTS, Manifest.permission.ACCESS_FINE_LOCATION},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
-
- }
- private static boolean requesCallPhonePermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.CALL_PHONE)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.CALL_PHONE},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
-
- private static boolean requestReadSDCardPermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.READ_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
- private static boolean requestCamerPermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.CAMERA)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.CAMERA},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
- private static boolean requestReadConstantPermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.READ_CONTACTS)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.READ_CONTACTS},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
- private static boolean requestGET_ACCOUNTSPermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.GET_ACCOUNTS)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.GET_ACCOUNTS},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
- private static boolean requestLocationPermissions( int requestCode)
- {
- if (ContextCompat.checkSelfPermission(context,
- Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED)
- {//没有权限
- ActivityCompat.requestPermissions(context,
- new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
- MY_PERMISSIONS_REQUEST_CALL_PHONE);
- return false;
- } else
- {
- return true;
- }
- }
- }
工具类使用方法如下:
我是在app第一次进入的时候,先判断android的版本,如果大于6.0,不管用户是否给与权限,都调用申请常用权限,防止因为用户不给于权限而导致崩溃,如:
存储,电话,相机,通讯录,位置等。防止用户
- if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
- new PermissionUtils(this).needPermission(200);
- }
然后在接下来的需要调用这些权限时调用相对应的方法,如打电话时调用requesCallPhonePermissions(200),参数随便传入。注意:此处的200 要与onRequestPermissionsResult中的参数requestCode一致。
重写请求权限后的回调方法:
- @Override
- public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
- switch (requestCode) {
- case 200: {
-
- if (grantResults.length > 0
- && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-
-
-
-
- Log.i("用户同意权限", "user granted the permission!");
-
- } else {
-
-
-
- Log.i("用户不同意权限", "user denied the permission!");
- }
- return;
- }
-
-
-
- }
- }