推薦一個好用的許可權申請框架
阿新 • • 發佈:2018-12-31
1.概述
android6.0以上,google為了系統的安全性,當app用到設計到使用者隱私的許可權的時候需要進行許可權適配,所以我們僅僅在AndroidManifest中宣告許可權還是不夠的。需要手動的進行許可權適配。無意中發現了一個許可權適配的非常好的框架,推薦給大家使用。
使用方法:在build.gradle中宣告 compile 'com.yanzhenjie:permission:1.1.0' 當然我用的是Android studio,要是還用eclipse那隻能說你out了。包引入完之後就直接同步工程就可以了。
貼一下主要程式碼
/** * 相機許可權申請 */ private void只需要呼叫AndPermission類,這個類是鏈式呼叫的方式,可以新增一個或者多個Permission,設定callback對許可權申請的結果進行監聽。rationale方法是用來顯示許可權申請對話方塊的,對話方塊也可以自定義。最後呼叫start方法,開始進行許可權適配。怎麼樣是不是用起來比原生的好用的多的多。cameraApply() { AndPermission.with(this) .permission(Permission.CAMERA) .callback(permissionListener) .rationale(new RationaleListener() { @Override public void showRequestPermissionRationale(int requestCode, Rationale rationale) { // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。AndPermission.rationaleDialog(MainActivity.this, rationale).show(); } }) .start(); }
2.程式碼
我把Android中所有需要許可權適配的許可權全部列舉出來了,以後方便查詢,demo中列舉了申請一個許可權,多個許可權的情況。下面看程式碼吧:
/**
* 許可權申請activity
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_calendarApply;
private Button btn_cameraApply;
private Button btn_contactsApply;
private Button btn_locationApply;
private Button btn_microphoneApply;
private Button btn_phoneApply;
private Button btn_sensorsApply;
private Button btn_smsApply;
private Button btn_storageApply;
private Button btn_moreApply;
private static final int REQUEST_CODE_SETTING = 300;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_calendarApply = (Button) findViewById(R.id.btn_calendarApply);
btn_cameraApply = (Button) findViewById(R.id.btn_cameraApply);
btn_contactsApply = (Button) findViewById(R.id.btn_contactsApply);
btn_locationApply = (Button) findViewById(R.id.btn_locationApply);
btn_microphoneApply = (Button) findViewById(R.id.btn_microphoneApply);
btn_phoneApply = (Button) findViewById(R.id.btn_phoneApply);
btn_sensorsApply = (Button) findViewById(R.id.btn_sensorsApply);
btn_smsApply = (Button) findViewById(R.id.btn_smsApply);
btn_storageApply = (Button) findViewById(R.id.btn_storageApply);
btn_moreApply = (Button) findViewById(R.id.btn_moreApply);
btn_calendarApply.setOnClickListener(this);
btn_cameraApply.setOnClickListener(this);
btn_contactsApply.setOnClickListener(this);
btn_locationApply.setOnClickListener(this);
btn_microphoneApply.setOnClickListener(this);
btn_phoneApply.setOnClickListener(this);
btn_sensorsApply.setOnClickListener(this);
btn_smsApply.setOnClickListener(this);
btn_storageApply.setOnClickListener(this);
btn_moreApply.setOnClickListener(this);
}
/**
* 日曆許可權申請
*/
private void calendarApply() {
AndPermission.with(this)
.permission(Permission.CALENDAR)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 相機許可權申請
*/
private void cameraApply() {
AndPermission.with(this)
.permission(Permission.CAMERA)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 通訊錄許可權申請
*/
private void cantactsApply() {
AndPermission.with(this)
.permission(Permission.CONTACTS)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 位置許可權申請
*/
private void locationApply() {
AndPermission.with(this)
.permission(Permission.LOCATION)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 音訊錄製許可權申請
*/
private void microphoneApply() {
AndPermission.with(this)
.permission(Permission.MICROPHONE)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 電話許可權申請
*/
private void phoneApply() {
AndPermission.with(this)
.permission(Permission.PHONE)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 感測器許可權申請
*/
private void sensorsApply() {
AndPermission.with(this)
.permission(Permission.SENSORS)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 簡訊許可權申請
*/
private void smsApply() {
AndPermission.with(this)
.permission(Permission.SMS)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 外部儲存許可權申請
*/
private void storageApply() {
AndPermission.with(this)
.permission(Permission.STORAGE)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 多個許可權同時申請
*/
private void moreApply() {
AndPermission.with(this)
.permission(Permission.CAMERA, Permission.STORAGE)
.callback(permissionListener)
.rationale(new RationaleListener() {
@Override
public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
// 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show();
}
})
.start();
}
/**
* 回撥監聽。
*/
private PermissionListener permissionListener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, @NonNull List<String> grantPermissions) {
Toast.makeText(MainActivity.this, "申請成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int requestCode, @NonNull List<String> deniedPermissions) {
// 使用者否勾選了不再提示並且拒絕了許可權,那麼提示使用者到設定中授權。
if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, deniedPermissions)) {
// 第一種:用預設的提示語。
AndPermission.defaultSettingDialog(MainActivity.this, REQUEST_CODE_SETTING).show();
}
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_calendarApply:
calendarApply();
break;
case R.id.btn_cameraApply:
cameraApply();
break;
case R.id.btn_contactsApply:
cantactsApply();
break;
case R.id.btn_locationApply:
locationApply();
break;
case R.id.btn_microphoneApply:
microphoneApply();
break;
case R.id.btn_phoneApply:
phoneApply();
break;
case R.id.btn_sensorsApply:
sensorsApply();
break;
case R.id.btn_smsApply:
smsApply();
break;
case R.id.btn_storageApply:
storageApply();
break;
case R.id.btn_moreApply:
moreApply();
break;
}
}
}
怎麼樣,是不是用起來特別簡單,而且功能強大呢。有需要的朋友可以去下載原始碼