Android6.0------許可權申請管理(單個許可權和多個許可權申請)

來源:互聯網
上載者:User

標籤:his   idm   listener   dshow   phone   電話   targe   view   bool   

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代碼寫的,項目危險許可權少則推薦使用,多的話就自己封裝或者藉助第三方了。

許可權申請有很多第三方封裝好的庫(工具類)可以實現,Github上一大把,後續部落格將找幾個好一點的來講解一下。

 

案例點擊下載

 

Android6.0------許可權申請管理(單個許可權和多個許可權申請)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.