Android 6.0动态权限申请教程

转载  更新时间:2017年03月19日 16:21:24   作者:Edwin05   我要评论

本文主要介绍了Android 6.0动态权限申请的教程,具有很好的参考价值。下面跟着小编一起来看下吧

PermissionManage

项目地址:https://github.com/why168/AndroidProjects/tree/master/PermissionManage

介绍

如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则应用在运行时向用户请求权限。

如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在用户安装应用时要求用户授予权限。

参考资料

https://developer.android.google.cn/guide/topics/security/permissions.html

https://github.com/lovedise/PermissionGen

https://github.com/tbruyelle/RxPermissions

以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了

group:android.permission-group.CONTACTS
 permission:android.permission.WRITE_CONTACTS
 permission:android.permission.GET_ACCOUNTS 
 permission:android.permission.READ_CONTACTS

 group:android.permission-group.PHONE
 permission:android.permission.READ_CALL_LOG
 permission:android.permission.READ_PHONE_STATE 
 permission:android.permission.CALL_PHONE
 permission:android.permission.WRITE_CALL_LOG
 permission:android.permission.USE_SIP
 permission:android.permission.PROCESS_OUTGOING_CALLS
 permission:com.android.voicemail.permission.ADD_VOICEMAIL

 group:android.permission-group.CALENDAR
 permission:android.permission.READ_CALENDAR
 permission:android.permission.WRITE_CALENDAR

 group:android.permission-group.CAMERA
 permission:android.permission.CAMERA

 group:android.permission-group.SENSORS
 permission:android.permission.BODY_SENSORS

 group:android.permission-group.LOCATION
 permission:android.permission.ACCESS_FINE_LOCATION
 permission:android.permission.ACCESS_COARSE_LOCATION

 group:android.permission-group.STORAGE
 permission:android.permission.READ_EXTERNAL_STORAGE
 permission:android.permission.WRITE_EXTERNAL_STORAGE

 group:android.permission-group.MICROPHONE
 permission:android.permission.RECORD_AUDIO
 group:android.permission-group.SMS
 permission:android.permission.READ_SMS
 permission:android.permission.RECEIVE_WAP_PUSH
 permission:android.permission.RECEIVE_MMS
 permission:android.permission.RECEIVE_SMS
 permission:android.permission.SEND_SMS
 permission:android.permission.READ_CELL_BROADCASTS

以下是普通权限,只需要在AndroidManifest.xml中申请即可

 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
 android.permission.ACCESS_NETWORK_STATE
 android.permission.ACCESS_NOTIFICATION_POLICY
 android.permission.ACCESS_WIFI_STATE
 android.permission.ACCESS_WIMAX_STATE
 android.permission.BLUETOOTH
 android.permission.BLUETOOTH_ADMIN
 android.permission.BROADCAST_STICKY
 android.permission.CHANGE_NETWORK_STATE
 android.permission.CHANGE_WIFI_MULTICAST_STATE
 android.permission.CHANGE_WIFI_STATE
 android.permission.CHANGE_WIMAX_STATE
 android.permission.DISABLE_KEYGUARD
 android.permission.EXPAND_STATUS_BAR
 android.permission.FLASHLIGHT
 android.permission.GET_ACCOUNTS
 android.permission.GET_PACKAGE_SIZE
 android.permission.INTERNET
 android.permission.KILL_BACKGROUND_PROCESSES
 android.permission.MODIFY_AUDIO_SETTINGS
 android.permission.NFC
 android.permission.READ_SYNC_SETTINGS
 android.permission.READ_SYNC_STATS
 android.permission.RECEIVE_BOOT_COMPLETED
 android.permission.REORDER_TASKS
 android.permission.REQUEST_INSTALL_PACKAGES
 android.permission.SET_TIME_ZONE
 android.permission.SET_WALLPAPER
 android.permission.SET_WALLPAPER_HINTS
 android.permission.SUBSCRIBED_FEEDS_READ
 android.permission.TRANSMIT_IR
 android.permission.USE_FINGERPRINT
 android.permission.VIBRATE
 android.permission.WAKE_LOCK
 android.permission.WRITE_SYNC_SETTINGS
 com.android.alarm.permission.SET_ALARM
 com.android.launcher.permission.INSTALL_SHORTCUT
 com.android.launcher.permission.UNINSTALL_SHORTCUT

示例代码

/**
 * BaseActivity
 * 
 * @author Edwin.Wu
 * @version 2017/3/17$ 14:12$
 * @since JDK1.8
 */
public class BaseActivity extends AppCompatActivity {

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 }
 /**
 * 为子类提供一个权限检查方法
 *
 * @param permissions
 * @return
 */
 public boolean hasPermission(String... permissions) {
 for (String permission : permissions) {
 if (ActivityCompat.checkSelfPermission(this, permission)
 != PackageManager.PERMISSION_GRANTED) {
 return false;
 }
 }
 return true;
 }
 /**
 * 权限请求申请
 *
 * @param requestCode 请求码
 * @param permissions 权限
 */
 public void requestPermission(int requestCode, String... permissions) {
 ActivityCompat.requestPermissions(this, permissions, requestCode);
 }
 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 switch (requestCode) {
 case PermissionsConstans.WRITE_STORAGE_CODE:
 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 doSDCardPermission();
 } else {
 //TODO 提示用户权限未授予
 Toast.makeText(BaseActivity.this, "WRITE_EXTERNAL_STORAGE 权限未开启", Toast.LENGTH_SHORT).show();
 }
 break;
 case PermissionsConstans.CALL_PHONE_CODE:
 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 doCallPhone();
 } else {
 //TODO 提示用户权限未授予
 Toast.makeText(BaseActivity.this, "ACTION_CALL 权限未开启", Toast.LENGTH_SHORT).show();
 }
 break;
 default:
 break;
 }
 }
 /**
 * 默认的写SD权限处理
 */
 protected void doSDCardPermission() {
 //TODO
 }
 /**
 * 默认的打电话处理
 */
 protected void doCallPhone() {
 //TODO 
 }
}
/**
 * BaseActivity
 *
 * @author Edwin.Wu
 * @version 2017/3/17 11:59
 * @since JDK1.8
 */
public class PermissionActivity extends BaseActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_permission);
 }
 public void callPhone(View view) {
 if (hasPermission(android.Manifest.permission.CALL_PHONE)) {
 doCallPhone();
 } else {
 requestPermission(PermissionsConstans.CALL_PHONE_CODE, android.Manifest.permission.CALL_PHONE);
 }
 }
 public void sdCardPermission(View view) {
 if (hasPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
 doSDCardPermission();
 } else {
 requestPermission(PermissionsConstans.WRITE_STORAGE_CODE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
 }
 }
 @Override
 protected void doCallPhone() {
 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse("tel:" + "10000"));
 startActivity(intent);
 }
 @Override
 protected void doSDCardPermission() {
 OkHttpClient okHttpClient = new OkHttpClient();
 Request request = new Request
 .Builder()
 .url("http://img.mmjpg.com/2015/350/3.jpg")
 .get()
 .build();
 Call call = okHttpClient.newCall(request);
 call.enqueue(new Callback() {
 @Override
 public void onFailure(Call call, IOException e) {
 }
 @Override
 public void onResponse(Call call, Response response) throws IOException {
 ResponseBody body = response.body();
 InputStream is = body.byteStream();
 int len = 0;
 byte[] bytes = new byte[2048];
 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg";
 File file = new File(path);
 FileOutputStream fos = new FileOutputStream(file);
 while ((len = is.read(bytes)) != -1) {
  fos.write(bytes, 0, len);
  fos.flush();
 }
 Toast.makeText(PermissionActivity.this, "SDCard写入成功", Toast.LENGTH_SHORT).show();
 Log.e("Edwin", "SDCard写入成功");
 }
 });
 }
}
/**
 * PermissionGen框架
 *
 * @author Edwin.Wu
 * @version 2017/3/17 23:19
 * @since JDK1.8
 */
public class PermissionGenActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_permission_gen);
 }
 public void openCamera(View view) {
 PermissionGen.needPermission(this, 200, Manifest.permission.CAMERA);
 }
 public void openGroup(View view) {
 PermissionGen
 .with(this)
 .addRequestCode(100)
 .permissions(
Manifest.permission.READ_CONTACTS,
Manifest.permission.RECEIVE_SMS,
  Manifest.permission.CAMERA,
Manifest.permission.WRITE_CONTACTS)
 .request();
 }
 @PermissionSuccess(requestCode = 100)
 public void openGroupSuccess() {
 Toast.makeText(this, "Group Permission Success", Toast.LENGTH_SHORT).show();
 startActivity(new Intent(this, ContactActivity.class));
 }
 @PermissionFail(requestCode = 100)
 private void openGroupFail() {
 Toast.makeText(this, "Group permission is not granted", Toast.LENGTH_SHORT).show();
 }
 @PermissionSuccess(requestCode = 200)
 public void openCameraSuccess() {
 Toast.makeText(this, "Camera permission Success", Toast.LENGTH_SHORT).show();
 }
 @PermissionFail(requestCode = 200)
 public void openCameraFail() {
 Toast.makeText(this, "Camera permission is not granted", Toast.LENGTH_SHORT).show();
 }
 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
 PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
 }
}
/**
 * RxPermissionGen框架
 *
 * @author Edwin.Wu
 * @version 2017/3/19 14:17
 * @since JDK1.8
 */
public class RxPermissionActivity extends AppCompatActivity {
 private static final String TAG = "RxPermissionsSample";
 private Camera camera;
 private SurfaceView surfaceView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 RxPermissions rxPermissions = new RxPermissions(this);
 rxPermissions.setLogging(true);
 setContentView(R.layout.activity_rx_permission);
 surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
 RxView.clicks(findViewById(R.id.enableCamera))
 // Ask for permissions when button is clicked
 .compose(rxPermissions.ensureEach(Manifest.permission.CAMERA))
 .subscribe(new Action1<Permission>() {
  @Override
  public void call(Permission permission) {
   Log.i(TAG, "Permission result " + permission);
   if (permission.granted) {
   releaseCamera();
   camera = Camera.open(0);
   try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
   } catch (IOException e) {
   Log.e(TAG, "Error while trying to display the camera preview", e);
   }
   } else if (permission.shouldShowRequestPermissionRationale) {
   // Denied permission without ask never again
   Toast.makeText(RxPermissionActivity.this, "Denied permission without ask never again", Toast.LENGTH_SHORT).show();
   } else {
   // Denied permission with ask never again
   // Need to go to the settings
   Toast.makeText(RxPermissionActivity.this, "Permission denied, can't enable the camera", Toast.LENGTH_SHORT).show();
   }
  }
  },
  new Action1<Throwable>() {
  @Override
  public void call(Throwable t) {
  Log.e(TAG, "onError", t);
  }
  },
  new Action0() {
  @Override
  public void call() {
  Log.i(TAG, "OnComplete");
  }
  });
 }
 @Override
 protected void onStop() {
 super.onStop();
 releaseCamera();
 }
 private void releaseCamera() {
 if (camera != null) {
 camera.release();
 camera = null;
 }
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Android提高之SurfaceView与多线程的混搭实例

    Android提高之SurfaceView与多线程的混搭实例

    这篇文章主要介绍了Android提高之SurfaceView与多线程的混搭,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • Android处理图像数据转换的各种方法

    Android处理图像数据转换的各种方法

    这篇文章主要介绍了Android处理图像数据转换的各种方法,本文讲解了RGB值转Bitmap、Color值转Bitmap、字节数组转Bitmap、读取文件转Bitmap、读取资源转Bitmap、输入流转Bitmap等内容,需要的朋友可以参考下
    2015-01-01
  • 浅析Android手机卫士读取联系人

    浅析Android手机卫士读取联系人

    这篇文章主要介绍了浅析Android手机卫士读取联系人的相关内容,通过getContentResolver()方法获取获取ContentResolver内容解析器对象,对android手机卫士读取联系人相关知识感兴趣的朋友参考下吧
    2016-04-04
  • Android UI控件ExpandableListView基本用法详解

    Android UI控件ExpandableListView基本用法详解

    这篇文章主要为大家详细介绍了Android UI控件ExpandableListView基本用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android获取点击屏幕的位置坐标

    Android获取点击屏幕的位置坐标

    这篇文章主要为大家详细介绍了Android获取点击屏幕的位置坐标,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android编程学习之抽象类AbsListView用法实例分析

    Android编程学习之抽象类AbsListView用法实例分析

    这篇文章主要介绍了Android编程学习之抽象类AbsListView用法,较为详细的分析了抽象类AbsListView的功能、结构、定义及使用注意事项等,需要的朋友可以参考下
    2015-10-10
  • android图像绘制(三)画布刷屏问题记录

    android图像绘制(三)画布刷屏问题记录

    在canvas中绘制动态图的时候,如果使用了一个固定的背景图片,只有一个小小的精灵在移动!这样的情况下却不得不在没帧中重新绘制背景图片,使得效率降低,本文章只是记录一下,并不是解决方法感兴趣的朋友可以了解下
    2013-01-01
  • Android Studio出现Failed to pull selection: open failed: Permission denied的解决思路

    Android Studio出现Failed to pull selection: open failed: Per

    本篇文章给大家分享了Android Studio中导出数据库文件的方法以及出现Failed to pull selection: open failed: Permission denied的解决思路,有兴趣的学习下。
    2018-05-05
  • Android6.0开发中屏幕旋转原理与流程分析

    Android6.0开发中屏幕旋转原理与流程分析

    这篇文章主要介绍了Android6.0开发中屏幕旋转原理与流程,结合实例形式详细分析了Android6.0屏幕旋转的原理与相关实现流程,并附带了Android动态开启与禁用屏幕旋转的实现方法,需要的朋友可以参考下
    2017-11-11
  • Android 6.0动态权限申请教程

    Android 6.0动态权限申请教程

    本文主要介绍了Android 6.0动态权限申请的教程,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03

最新评论