permissions4m阿弃,是國(guó)產(chǎn) Android 權(quán)限申請(qǐng)最佳適配方案遭赂。解決了在小米手機(jī)上進(jìn)行權(quán)限申請(qǐng)時(shí),所遇到的一些坑贤斜,也增強(qiáng)了魅族手機(jī)中的權(quán)限申請(qǐng)。
下面我們直接看其使用:
申請(qǐng)權(quán)限
Permissions4M.get(this)
.requestForce(true)//是否強(qiáng)制彈出權(quán)限申請(qǐng)對(duì)話框
.requestPageType(Permissions4M.PageType.MANAGER_PAGE)//返回的 intent 是跳轉(zhuǎn)至**系統(tǒng)設(shè)置頁(yè)面**
.requestPermissions(Manifest.permission.ACCESS_COARSE_LOCATION)//申請(qǐng)的權(quán)限
.requestCodes(LOCATION_CODE)//申請(qǐng)的code(自定義)
.request();
權(quán)限申請(qǐng)成功后回調(diào)
/**
* 授權(quán)成功是回調(diào)
* @param code
*/
@PermissionsGranted({LOCATION_CODE})
public void granted(int code){
switch (code){
case LOCATION_CODE:
ToastUtils.showShort("定位權(quán)限申請(qǐng)成功");
break;
default:
break;
}
}
權(quán)限申請(qǐng)失敗后回調(diào)
/**
* 授權(quán)失敗時(shí)回調(diào)
* @param code
*/
@PermissionsDenied({LOCATION_CODE})
public void denied(int code){
switch (code){
case LOCATION_CODE:
ToastUtils.showShort("定位權(quán)限申請(qǐng)失敗");
break;
default:
break;
}
}
權(quán)限申請(qǐng)逛裤,二次授權(quán)時(shí)回調(diào)
如果用戶不需要自己彈出提示對(duì)話框
的話瘩绒,使用@PermissionsRationale
,具體代碼如下:
/**
* 二次授權(quán)時(shí)回調(diào)
* @param code
* 不需要自己彈出對(duì)話框的話带族,使用 PermissionsRationale
*/
@PermissionsRationale({LOCATION_CODE})
public void rationale(int code){
switch (code){
case LOCATION_CODE:
ToastUtils.showShort("需要定位權(quán)限锁荔,應(yīng)用才能正常使用...");
break;
default:
break;
}
}
如果用戶需要自己彈出提示對(duì)話框
的話,使用@PermissionsCustomRationale
蝙砌,具體代碼如下:
/**
* 二次授權(quán)時(shí)回調(diào)
* @param code
* 需要自己彈出對(duì)話框的話阳堕,使用 PermissionsCustomRationale
*/
@PermissionsCustomRationale({LOCATION_CODE})
public void locationRationale(int code){
switch (code){
case LOCATION_CODE:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶,我們需要開(kāi)啟您的定位權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.ACCESS_COARSE_LOCATION)
.requestCodes(LOCATION_CODE)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
default:
break;
}
}
如果用戶拒絕權(quán)限申請(qǐng)且選擇了不在提示
時(shí)择克,使用@PermissionsNonRationale
;具體代碼如下:
/**
* 二次授權(quán)時(shí)回調(diào)
* @param code
* 拒絕權(quán)限且不再提示時(shí),使用下面 PermissionsNonRationale
*/
@PermissionsNonRationale({LOCATION_CODE})
public void nonRationale(int code, final Intent intent){
switch (code){
case LOCATION_CODE:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶恬总,我們需要開(kāi)啟您的定位權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
startActivity(intent);//此處的Intent 類型為兩種,一種是跳轉(zhuǎn)至系統(tǒng)設(shè)置頁(yè)面肚邢,另一種是跳至手機(jī)管家頁(yè)面壹堰,而具體的設(shè)置方法請(qǐng)參考 注解回調(diào) 中 .requestPageType(int) 設(shè)置方法。
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
default:
break;
}
}
當(dāng)用戶拒絕權(quán)限且選擇不在提示時(shí)骡湖,會(huì)調(diào)用此權(quán)限申請(qǐng)回調(diào)方法
/**
* 在 Activity 或 Fragment 中贱纠,需要手動(dòng)添加 onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)方法以支持權(quán)限申請(qǐng)回調(diào)
* 拒絕權(quán)限且選擇不在提示時(shí),會(huì)調(diào)用此權(quán)限申請(qǐng)回調(diào)方法
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Permissions4M.onRequestPermissionsResult(PermissionActivity.this, requestCode, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
補(bǔ)充:一次性申請(qǐng)多種權(quán)限
@PermissionsRequestSync(permission = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, value = {REQUEST_CAMERA, REQUEST_WRITE_STORAGE})
public class MainActivity extends AppCompatActivity {
private final String TAG = MainActivity.class.getSimpleName();
public static final int REQUEST_CAMERA = 0x1000;
public static final int REQUEST_WRITE_STORAGE = 0x1001;
可以看到一次性申請(qǐng)多種權(quán)限是使用@PermissionsRequestSync
勺鸦,并且是寫(xiě)在類之外的并巍;而且定義的code
是公共的靜態(tài)常量目木。這樣要申請(qǐng)的權(quán)限和需要的code
就定義完成了换途,下面看代碼中的使用。
Permissions4M.get(this)
.requestForce(true)//是否強(qiáng)制彈出權(quán)限申請(qǐng)對(duì)話框
.requestSync();
對(duì)于申請(qǐng)成功和失敗的處理和前面的差不多刽射,看代碼:
@PermissionsGranted({REQUEST_CAMERA, REQUEST_WRITE_STORAGE})
public void granted(int code) {
switch (code) {
case REQUEST_CAMERA:
Log.e(TAG, "照相機(jī)權(quán)限申請(qǐng)成功...");
break;
case REQUEST_WRITE_STORAGE:
Log.e(TAG, "寫(xiě)存儲(chǔ)權(quán)限申請(qǐng)成功...");
break;
default:
break;
}
}
@PermissionsDenied({REQUEST_CAMERA, REQUEST_WRITE_STORAGE})
public void denied(int code) {
switch (code) {
case REQUEST_CAMERA:
Log.e(TAG, "照相機(jī)權(quán)限申請(qǐng)失敗...");
break;
case REQUEST_WRITE_STORAGE:
Log.e(TAG, "寫(xiě)存儲(chǔ)權(quán)限申請(qǐng)失敗...");
break;
default:
break;
}
}
一次性多種權(quán)限申請(qǐng)军拟,也可以用下面的這個(gè)方法完成:
Permissions4M.get(this)
.requestForce(true)
.requestPermissions(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE)
.requestCodes(100, 101, 102)
.requestListener(new ListenerWrapper.PermissionRequestListener() {
@Override
public void permissionGranted(int i) {
switch (i){
case 100:
Log.e("LHC", "照相機(jī)權(quán)限申請(qǐng)成功.");
break;
case 101:
Log.e("LHC", "手機(jī)信息權(quán)限申請(qǐng)成功.");
break;
case 102:
Log.e("LHC", "讀權(quán)限申請(qǐng)成功.");
break;
default:
break;
}
}
@Override
public void permissionDenied(int i) {
switch (i){
case 100:
Log.e("LHC", "照相機(jī)權(quán)限申請(qǐng)失敗..");
break;
case 101:
Log.e("LHC", "手機(jī)信息權(quán)限申請(qǐng)失敗..");
break;
case 102:
Log.e("LHC", "讀寫(xiě)權(quán)限申請(qǐng)失敗..");
break;
default:
break;
}
}
@Override
public void permissionRationale(int i) {//這個(gè)和permissionCustomRationale的調(diào)用二選一,根據(jù)自己的意愿誓禁。如果都寫(xiě)著也不影響懈息,只會(huì)調(diào)用permissionCustomRationale。
switch (i){
case 100:
Log.e("LHC", "請(qǐng)開(kāi)啟照相機(jī)權(quán)限");
break;
case 101:
Log.e("LHC", "請(qǐng)開(kāi)啟手機(jī)信息權(quán)限");
break;
case 102:
Log.e("LHC", "請(qǐng)開(kāi)啟手機(jī)讀寫(xiě)權(quán)限");
break;
default:
break;
}
}
})
.requestCustomRationaleListener(new ListenerWrapper.PermissionCustomRationaleListener() {
@Override
public void permissionCustomRationale(int i) {
switch (i) {
case 100:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶摹恰,我們需要開(kāi)啟您的照相機(jī)權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.CAMERA)
.requestCodes(100)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
case 101:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶辫继,我們需要開(kāi)啟您的手機(jī)信息權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.READ_PHONE_STATE)
.requestCodes(101)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
case 102:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶怒见,我們需要開(kāi)啟您的讀寫(xiě)權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
.requestCodes(102)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
default:
break;
}
}
})
.requestPage(new ListenerWrapper.PermissionPageListener() {
@Override
public void pageIntent(int i, final Intent intent) {
switch (i){
case 100:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("照相機(jī)權(quán)限申請(qǐng):\n我們需要您開(kāi)啟讀取照相機(jī)權(quán)限(in activity with listener)")
.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 101:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("手機(jī)信息權(quán)限申請(qǐng):\n我們需要您開(kāi)啟讀取手機(jī)信息權(quán)限(in activity with listener)")
.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 102:
break;
default:
break;
}
}
})
.request();
}
也可以將上面的實(shí)現(xiàn)寫(xiě)成:
Permissions4M.get(this)
.requestForce(true)
.requestPermissions(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE)
.requestCodes(100, 101, 102)
.requestListener(this)
.requestCustomRationaleListener(this)
.requestPage(this)
.request();
@Override
public void permissionGranted(int i) {
switch (i) {
case 100:
Log.e("LHC", "照相機(jī)權(quán)限申請(qǐng)成功.");
break;
case 101:
Log.e("LHC", "手機(jī)信息權(quán)限申請(qǐng)成功.");
break;
case 102:
Log.e("LHC", "讀權(quán)限申請(qǐng)成功.");
break;
default:
break;
}
}
@Override
public void permissionDenied(int i) {
switch (i) {
case 100:
Log.e("LHC", "照相機(jī)權(quán)限申請(qǐng)失敗..");
break;
case 101:
Log.e("LHC", "手機(jī)信息權(quán)限申請(qǐng)失敗..");
break;
case 102:
Log.e("LHC", "讀寫(xiě)權(quán)限申請(qǐng)失敗..");
break;
default:
break;
}
}
@Override
public void permissionRationale(int i) {//這個(gè)和permissionCustomRationale的調(diào)用二選一,根據(jù)自己的意愿姑宽。如果都寫(xiě)著也不影響遣耍,只會(huì)調(diào)用permissionCustomRationale。
switch (i) {
case 100:
Log.e("LHC", "請(qǐng)開(kāi)啟照相機(jī)權(quán)限");
break;
case 101:
Log.e("LHC", "請(qǐng)開(kāi)啟手機(jī)信息權(quán)限");
break;
case 102:
Log.e("LHC", "請(qǐng)開(kāi)啟手機(jī)讀寫(xiě)權(quán)限");
break;
default:
break;
}
}
@Override
public void permissionCustomRationale(int i) {
switch (i) {
case 100:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶炮车,我們需要開(kāi)啟您的照相機(jī)權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.CAMERA)
.requestCodes(100)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
case 101:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶舵变,我們需要開(kāi)啟您的手機(jī)信息權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.READ_PHONE_STATE)
.requestCodes(101)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
case 102:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("親愛(ài)的用戶,我們需要開(kāi)啟您的讀寫(xiě)權(quán)限.")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtils.showShort("前往設(shè)置界面");
Permissions4M.get(PermissionActivity.this)
.requestOnRationale()
.requestPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
.requestCodes(102)
.request();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
break;
default:
break;
}
}
@Override
public void pageIntent(int i, final Intent intent) {
switch (i) {
case 100:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("照相機(jī)權(quán)限申請(qǐng):\n我們需要您開(kāi)啟讀取照相機(jī)權(quán)限(in activity with listener)")
.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 101:
new AlertDialog.Builder(PermissionActivity.this)
.setMessage("手機(jī)信息權(quán)限申請(qǐng):\n我們需要您開(kāi)啟讀取手機(jī)信息權(quán)限(in activity with listener)")
.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 102:
startActivity(intent);
break;
default:
break;
}
}
這樣權(quán)限申請(qǐng)就算完成了.