Android6.0------許可權申請管理(單個許可權和多個許可權申請)
Android開發時,到6.0系統上之後,有的許可權就得申請才能用了。
Android將許可權分為正常許可權 和 危險許可權
Android系統許可權分為幾個保護級別。需要了解的兩個最重要保護級別是 正常許可權 和 危險許可權:
(1)正常許可權:
涵蓋應用需要訪問其沙盒外部資料或資源,但對使用者隱私或其他應用操作風險很小的區域。
這些許可權在應用安裝時授予,執行時不再詢問使用者。例如: 網路訪問、WIFI狀態、音量設定等。
(2)危險許可權:
涵蓋應用需要涉及使用者隱私資訊的資料或資源,或者可能對使用者儲存的資料或其他應用的操作產生影響的區域。
例如: 讀取通訊錄、讀寫儲存器資料、獲取使用者位置等。如果應用宣告需要這些危險許可權,則必須在執行時明確告訴使用者,讓使用者手動授予。
許可權相關知識,許可權表請看部落格: Android6.0------許可權管理
前提:APP執行在Android 6.0 (API level 23)或者更高階別的裝置中,而且targetSdkVersion>=23
時,系統將會自動採用動態許可權管理策略,
先來看看效果圖:(注:如果未授權就點選打電話或拍照就會直接閃退,由此6.0必須手動授權,開發時如果未授權,可以判斷並提示使用者從新授權)
上圖:
1:單個授權,電話授權。
2:有電話,SD卡,拍照授權三個一起授權
案例程式碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;
private static final int MY_PERMISSIONS_REQUEST_CALL_CAMERA = 2;
String[] permissions = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CALL_PHONE
};
// 宣告一個集合,在後面的程式碼中用來儲存使用者拒絕授權的權
List<String> mPermissionList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1: //單個授權
//檢查版本是否大於M
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
}else {
showToast("許可權已申請");
}
}
break;
case R.id.btn2://多個授權
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(MainActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.isEmpty()) {//未授予的許可權為空,表示都授予了
Toast.makeText(MainActivity.this,"已經授權",Toast.LENGTH_LONG).show();
} else {//請求許可權方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//將List轉為陣列
ActivityCompat.requestPermissions(MainActivity.this, permissions, MY_PERMISSIONS_REQUEST_CALL_CAMERA);
}
break;
case R.id.btn3:
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(camera, 1);
break;
case R.id.btn4:
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showToast("許可權已申請");
} else {
showToast("許可權已拒絕");
}
}else if (requestCode == MY_PERMISSIONS_REQUEST_CALL_CAMERA){
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判斷是否勾選禁止後不再詢問
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[i]);
if (showRequestPermission) {
showToast("許可權未申請");
}
}
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void showToast(String string){
Toast.makeText(MainActivity.this,string,Toast.LENGTH_LONG).show();
}
}
前提一定要注意:AndroidManifest
中:
<uses-permission android:name="android.permission.CALL_PHONE"/> //電話
<uses-permission android:name="android.permission.CAMERA"/> //拍照
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> //sd卡
此案例是自己全部用Java程式碼寫的,專案危險許可權少則推薦使用,多的話就自己封裝或者藉助第三方了。
相關文章
- android強制申請許可權Android
- delphi安卓動態許可權申請安卓
- 簡單幾行程式碼申請許可權行程
- android 6.0許可權機制的簡單封裝(支援批量申請許可權)Android封裝
- iOS相關許可權檢測和申請iOS
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- android 6.0許可權申請機制(簡單案例)Android
- 許可權之選單許可權
- Android優雅地申請動態許可權Android
- 在Android上優雅的申請許可權Android
- 原生Android之(6.0及以上)許可權申請Android
- 程式請求管理員許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Linux-許可權管理(ACL許可權)Linux
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- 這個許可權動態申請庫,值得嘗試一下
- 選單許可權和按鈕許可權設定
- Android開發-更”聰明”的申請許可權方式Android
- Android系統許可權和root許可權Android
- Linux 許可權管理之目錄許可權限制Linux
- 許可權系統:一文搞懂功能許可權、資料許可權
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- PostgreSQL:許可權管理SQL
- Mysql——許可權管理MySql
- Mysql 許可權管理MySql
- oracle 許可權管理Oracle
- 4、許可權管理
- sql許可權管理SQL
- 許可權管理策略
- MySQL許可權管理MySql
- 許可權系統:6個許可權概念模型設計模型
- Xamarin Android許可權請求Android
- 【FAQ】申請Health Kit許可權的常見問題及解答
- React-Native之Android(6.0及以上)許可權申請ReactAndroid
- 【許可權管理】Oracle中檢視、回收使用者許可權Oracle
- AIX 的許可許可權(轉)AI
- 角色許可權(Role)和系統許可權(System)的幾個澄清實驗
- 賬號和許可權管理