Android6.0权限问题,并撰写常用权限工具类
来源:互联网 发布:想做淘宝模特怎么入行 编辑:程序博客网 时间:2024/05/21 06:02
在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) { //申请CAMERA的权限 requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); } else { photo(); pop.dismiss(); ll_popup.clearAnimation(); }}权限返回结果@Overridepublic 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 static final int MY_PERMISSIONS_REQUEST_CALL_PHONE=200; /** * 单例对象实例 */ private static PermissionUtils instance = null; public static PermissionUtils getInstance(Activity context) { if (instance == null) { instance = new PermissionUtils(context); } return instance; } private PermissionUtils(Activity context) { this.context=context; } public void needPermission(int requestCode) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M){ return; } requestAllPermissions(requestCode); } /* * * 申请授予权限 * CALL_PHONE READ_EXTERNAL_STORAGE CAMERA READ_CONTACTS GET_ACCOUNTS ACCESS_FINE_LOCATION * */ public void requestAllPermissions( int requestCode) { ActivityCompat.requestPermissions(context, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA,Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_CALL_PHONE); } public 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; } } public 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; } } public 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; } } public 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; } } public 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; } } public 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一致。重写请求权限后的回调方法:@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 200: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do.//同意给与权限 可以再此处调用拍照 Log.i("用户同意权限", "user granted the permission!"); } else { // permission denied, boo! Disable the // f用户不同意 可以给一些友好的提示 Log.i("用户不同意权限", "user denied the permission!"); } return; } // other 'case' lines to check for other // permissions this app might request }}二、分别申请,每当使用某项需要权限的功能,就要进行权限申请。工具类:package www.doolii.cn.permissiondemo;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;/** * 检查权限的工具类 * <p/> * Created by lizhiqaing on 16/7/19. */public class PermissionsChecker { private final Activity context; public static final int MY_PERMISSIONS_REQUEST=200; static PermissionsChecker checker=null; private PermissionsChecker(Activity context) { this.context=context; } public static PermissionsChecker getInstance(Activity context){ return new PermissionsChecker(context); } // 判断权限集合 public boolean lacksPermissions(String... permissions) { for (int i=0;i<permissions.length;i++){ if (lacksPermission(permissions[i])) {//无权限 return true; } } return false; } // 判断是否缺少权限 无权限返回true private boolean lacksPermission(String permission) { return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED; }}使用:package www.doolii.cn.permissiondemo;import android.Manifest;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Build;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.telephony.TelephonyManager;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private PermissionsChecker mPermissionsChecker; // 权限检测器 // 所需的权限 static final String[] PERMISSIONS = new String[]{ Manifest.permission.READ_PHONE_STATE }; PermissionsChecker checker=PermissionsChecker.getInstance(MainActivity.this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.photo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ //拍照的时候要进行权限判断 if (checker.lacksPermissions(PERMISSIONS)){//true 代表无权限 Toast.makeText(MainActivity.this,"无权限了",Toast.LENGTH_SHORT).show(); //申请权限 ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, 200); }else{ Toast.makeText(MainActivity.this,getDeviceInfo(MainActivity.this),Toast.LENGTH_SHORT).show(); } }else { // 如果是6.0以下 不需要权限判断检查版本 直接调用拍照 Toast.makeText(MainActivity.this,"6.0以下不需要主动申请权限哦",Toast.LENGTH_SHORT).show(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case 200: if (grantResults.length > 0) { for (int i=0;i<grantResults.length;i++){ if (grantResults[i]== PackageManager.PERMISSION_GRANTED){ Toast.makeText(MainActivity.this,getDeviceInfo(MainActivity.this),Toast.LENGTH_SHORT).show(); } } } break; } } public static String getDeviceInfo(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (tm!=null) { return tm.getDeviceId(); }else{ return null; } }}
1 0
- Android6.0权限问题,并撰写常用权限工具类
- Android6.0权限问题,并撰写常用权限工具类
- android6.0权限问题
- Android6.0权限问题
- Android6.0权限问题
- android6.0权限问题
- Android6.0权限问题
- Android6.0权限问题
- android6.0权限问题
- Android6.0权限问题
- Android6.0权限问题
- android6.0以上权限申请工具类
- Android6.0手机权限处理工具类
- Android6.0权限permission提醒工具类
- android6.0动态权限申请工具类
- android6.0以上权限申请工具类
- Android6.0-蓝牙权限问题
- Android6.0的权限问题
- shell中字符串的简单操作
- 告别码农,成为真正的程序员
- 专为HTML5开发的骨骼动画引擎AlloyStick
- Cross entropy
- nginx限流算法
- Android6.0权限问题,并撰写常用权限工具类
- Ubuntu14.04默认源
- AndroidStudio--Git--回滚
- mysql字符串函数练习
- 面向vs10使用的GDAL库编译Win7(32/64)(图文教程+亲测可用!)
- 虚函数和纯虚函数
- Jeecg心得
- Binder连接池的实现步骤
- 基类构造和派生构造