//主程序入口
package com.dynamicpermissions.dynamicpermissions; import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import permissions.dispatcher.NeedsPermission; import permissions.dispatcher.OnNeverAskAgain; import permissions.dispatcher.OnPermissionDenied; import permissions.dispatcher.OnShowRationale; import permissions.dispatcher.PermissionRequest; import permissions.dispatcher.RuntimePermissions; @RuntimePermissions public class MainActivity extends AppCompatActivity { Button mBtnCall; Button mBtnTake; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnCall= (Button) findViewById(R.id.btn_call); mBtnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e("打电话", "----"); /* * 第一次需要注销掉,然后进行编译,之后再开始调试 * */ MainActivityPermissionsDispatcher.CallWithCheck(MainActivity.this); } }); mBtnTake = (Button) findViewById(R.id.btn_tack); mBtnTake.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePicture(); /* * 第一次需要注销掉,然后进行编译,之后再开始调试 * */ MainActivityPermissionsDispatcher.takePictureWithCheck(MainActivity.this); } }); } @NeedsPermission(Manifest.permission.CAMERA) void takePicture() { Log.e("拍照的方法","====="); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } @NeedsPermission(Manifest.permission.CALL_PHONE) void Call() { Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "10086"); intent.setData(data); try { startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } @OnShowRationale(Manifest.permission.CALL_PHONE) void showWhy(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage("提示用户为何要开启此权限") .setPositiveButton("知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { request.proceed(); } }).show(); } @OnPermissionDenied(Manifest.permission.CALL_PHONE) void showDenied() { Toast.makeText(this, "用户选择拒绝的提示!", Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CALL_PHONE) void showNotAsk() { new AlertDialog.Builder(this) .setMessage("该功能需要访问电话权限,不开启将无法正常工作") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }).show(); } @NeedsPermission(Manifest.permission.INTERNET) void interrnert() { Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "10086"); intent.setData(data); try { startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } @OnShowRationale(Manifest.permission.INTERNET) void show(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage("提示用户此权限") .setPositiveButton("知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { request.proceed(); } }).show(); } @OnPermissionDenied(Manifest.permission.INTERNET) void showDen() { Toast.makeText(this, "用户选择拒绝的提示!", Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.INTERNET) void showNot() { new AlertDialog.Builder(this) .setMessage("该功能,不开启将无法正常工作") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }).show(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); }}
==========================================================================================
//adnrdoidmanifest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dynamicpermissions.dynamicpermissions"> <!--操作通讯录的权限--> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <!--打电话的权限--> <uses-permission android:name="android.permission.CALL_PHONE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>==========================================================================================app中的build.gradle
apply plugin: 'com.android.application' /* *设置添加动态权限需要 * */ apply plugin: 'android-apt' /*************************************************************/ android { compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.dynamicpermissions.dynamicpermissions" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' /*添加动态权限需要的 * */ //动态添加权限 /** *********************************************************************************************************/ compile 'com.github.hotchemi:permissionsdispatcher:2.1.3' apt 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3' /** ***************************************************************************************************/ }=========================================================================================app外面的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' /* *设置权限问题 需要添加 * */ /**********************************************************************/ classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' /**********************************************************************/ // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }===========================================================================================项目地址:
http://pan.baidu.com/s/1o8OHjOQ