【Android】permissions4m 库解决系统运行时权限使用记录

来源:互联网 发布:wow插件mac版 编辑:程序博客网 时间:2024/06/07 10:34

参考文章:http://blog.csdn.net/ziwang_/article/details/77435271 
http://blog.csdn.net/lmj623565791/article/details/50709663 
permissions4m 地址:https://github.com/jokermonn/permissions4m

正文: 
当 targetSdkVersion 值设置23以上,就会涉及到系统运行时权限,我这边体验了一下permissions4m 这个库,还不错,记录一下

引入方式

项目的build.gradle:

allprojects {

repositories {
jcenter()
// 请添加如下一行
maven { url 'https://jitpack.io' }
}
}

app 中的 build.gradle:

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])
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:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.github.jokermonn:permissions4m:2.1.0-lib'
annotationProcessor 'com.github.jokermonn:permissions4m:2.1.0-processor'
}

使用方式

我这边暂时处理打电话和打开通讯录,在AndroidManifest.xml里面设置权限:

<uses-permission android:name="android.permission.CALL_PHONE" />

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

MainActivity.java 这个类调用如下:

import android.Manifest;

import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.joker.annotation.PermissionsDenied;
import com.joker.annotation.PermissionsGranted;
import com.joker.annotation.PermissionsNonRationale;
import com.joker.annotation.PermissionsRationale;
import com.joker.api.Permissions4M;
public class MainActivity extends AppCompatActivity {
Button call_phone, phone_log,open_camera;
private static final int CALL_PHONE_CODE = 1;
private static final int CALL_LOG_CODE = 2;
private static final int REQUEST_CONTACT = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
addListener();
}
private void findViews() {
call_phone = (Button) findViewById(R.id.call_phone);
phone_log = (Button) findViewById(R.id.phone_log);
open_camera = (Button) findViewById(R.id.open_camera);
}
private void addListener() {
/**打电话**/
call_phone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//申请权限
Permissions4M.get(MainActivity.this)
// 是否强制弹出权限申请对话框,建议为 true
.requestForce(true)
// 申请权限
.requestPermissions(Manifest.permission.CALL_PHONE)
// 权限码
.requestCodes(CALL_PHONE_CODE)
// 如果需要使用 @PermissionNonRationale 注解的话,建议添加如下一行
// 返回的 intent 是跳转至**系统设置页面**
//.requestPageType(Permissions4M.PageType.MANAGER_PAGE)
// 返回的 intent 是跳转至**手机管家页面**
.requestPageType(Permissions4M.PageType.ANDROID_SETTING_PAGE)
.request();
}
});
/**通讯录**/
phone_log.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Permissions4M.get(MainActivity.this)
.requestPermissions(Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS)
.requestCodes(CALL_LOG_CODE)
//.requestPageType(Permissions4M.PageType.MANAGER_PAGE)
.requestPageType(Permissions4M.PageType.MANAGER_PAGE)
.request();
}
});
}
//------------------------------------------------------------------------------------
//授权成功时回调
@PermissionsGranted({CALL_PHONE_CODE, CALL_LOG_CODE})
public void granted(int code) {
switch (code) {
case CALL_PHONE_CODE:
//ToastUtil.show("权限授权成功");
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:xxxxxx"));
startActivity(intent);
break;
case CALL_LOG_CODE:
//ToastUtil.show("权限授权成功");
Intent intent2 = new Intent();
intent2.setAction(Intent.ACTION_PICK);
intent2.setData(ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent2, REQUEST_CONTACT);
break;
}
}
//授权失败时回调
@PermissionsDenied({CALL_PHONE_CODE, CALL_LOG_CODE})
public void denied(int code) {
switch (code) {
case CALL_PHONE_CODE:
//ToastUtil.show("权限授权失败");
break;
case CALL_LOG_CODE:
//ToastUtil.show("权限授权失败");
break;
}
}
//二次授权时回调,用于解释为何需要此权限
@PermissionsRationale({CALL_PHONE_CODE, CALL_LOG_CODE})
public void rationale(int code) {
switch (code) {
case CALL_PHONE_CODE:
//ToastUtil.show("请开启权限授权");
break;
case CALL_LOG_CODE:
//ToastUtil.show("请开启权限授权");
break;
}
}
//------------------------------------------------------------------------------------
@PermissionsNonRationale({CALL_PHONE_CODE, CALL_LOG_CODE})
public void storageAndCallRationale(int code, final Intent intent) {
switch (code) {
case CALL_PHONE_CODE:
new AlertDialog.Builder(MainActivity.this)
.setMessage("亲爱的用户,我们需要您开启打电话权限\n请点击前往设置页面")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
})
.show();
break;
case CALL_LOG_CODE:
new AlertDialog.Builder(MainActivity.this)
.setMessage("亲爱的用户,我们需要您开启读取通讯录权限\n请点击前往设置页面")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
})
.show();
break;
default:
break;
}
}
//------------------------------------------------------------------------------------
//必加的二次权限申请回调
//在 Activity 或 Fragment 中,需要手动添加 onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
// 方法以支持权限申请回调,代码如下即可:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Permissions4M.onRequestPermissionsResult(MainActivity.this, requestCode, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CONTACT) {
if (resultCode == RESULT_OK) {
if (data == null) {
return;
}
Uri result = data.getData();
}
}
}
}

界面上面就是两个Button。

附录系统运行时权限组:

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

知行办公,专业移动办公平台 https://zx.naton.cn/

原创团队
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;【测试】土镜问道,847071279@qq.com
【数据】fox009521,42151960@qq.com;【安全】保密,你懂的。






阅读全文
0 0
原创粉丝点击