Android 權限申請
參考資料
https://www.jianshu.com/p/338741725cd0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
Android權限(普通權限+危險權限)
https://blog.csdn.net/feibendexiaoma/article/details/80093354
允許安裝未知來源權限(一)
https://blog.csdn.net/qq_34330286/article/details/79660059
Android6.0以上允許讀寫權限
- Android權限分類*
正常權限,危險權限,特殊權限
- 正常權限
正常權限涵蓋應用需要通路其沙盒外部資料或資源,但對使用者隐私或其他應用操作風險很小的區域。例如,設定時區的權限就是正常權限。此類權限都是正常保護的權限,隻需要在Manifest檔案中簡單聲明,安裝即授權,如網絡權限
配置方法,在Manifest檔案中簡單聲明,安裝即授權
- 危險權限
危險權限涵蓋應用需要涉及使用者隐私資訊的資料或資源,或者可能對使用者存儲的資料或其他應用的操作産生影響的區域。例如,能夠讀取使用者的聯系人屬于危險權限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
配置方法,使用時先檢查權限是否開啟,未開啟則需要使用者手動開啟
如果App需要用到危險權限,需要這一權限的操作時都必須檢查自己是否擁有該權限。檢查權限代碼如下所示:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
如果應用已經具有了該權限,此方法将傳回 PackageManager.PERMISSION_GRANTED,并且應用可以繼續操作。如果應用不具有此權限,方法将傳回 PERMISSION_DENIED,此時應用應當進行權限申請。
Android危險權限
編号 權限組 權限
0 CALENDAR READ_CALENDAR WRITE_CALENDAR
1 CAMERA CAMERA
2 CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
3 LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
4 MICROPHONE RECORD_AUDIO
5 PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
6 SENSORS BODY_SENSORS
7 SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
8 STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE
注意:表格中的每個危險權限都屬于一個權限組,我們在進行運作時權限處理時使用的是權限名,但是使用者一旦同意授權了,那麼該權限所對應的權限組中的其他權限也會同時被授權。
配置源碼
單個權限
//第一步:看權限是否已經被申請,沒有則申請權限
private void CheckPermssion(){
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
//是否有擷取手機EMEI權限
if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
//第二步調用requestPermissions申請權限
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_PHONE_STATE},2);
}
}
}
//第三步:若有需要,調用回調函數
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
}
多個權限
//第一步:看權限是否已經被申請,沒有則申請權限
private void CheckPermssion(){
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.CALL_PHONE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty())
{
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
//第二步調用requestPermissions申請權限
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
}
}
}
}
//第三步:若有需要,調用回調函數
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
call();
}else{
Toast.makeText(MainActivity.this, "發生未知錯誤", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
}
3 特殊權限
有許多權限其行為方式與正常權限及危險權限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,是以大多數應用不應該使用它們。如果某應用需要其中一種權限,必須在清單中聲明該權限,并且發送請求使用者授權的 intent。系統将向使用者顯示詳細資訊,以響應該 intent。