<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Permission 使用詳解

          共 4893字,需瀏覽 10分鐘

           ·

          2020-10-25 16:45

          和你一起終身學(xué)習(xí),這里是程序員Android

          經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識(shí)點(diǎn):

          一、安全架構(gòu)設(shè)計(jì)

          二、應(yīng)用簽名

          三、用戶ID 和文件訪問

          四、使用權(quán)限

          五、正常權(quán)限和危險(xiǎn)權(quán)限

          六、自定義權(quán)限

          七、動(dòng)態(tài)申請(qǐng)權(quán)限案例

          Android?是一個(gè)權(quán)限分隔的操作系統(tǒng),其中每個(gè)應(yīng)用都有其獨(dú)特的系統(tǒng)標(biāo)識(shí)(Linux?用戶ID?和組?ID)。系統(tǒng)各部分也分隔為不同的標(biāo)識(shí)。Linux據(jù)此將不同的應(yīng)用以及應(yīng)用與系統(tǒng)分隔開來(lái)。

          其他更詳細(xì)的安全功能通過“權(quán)限”機(jī)制提供,此機(jī)制會(huì)限制特定進(jìn)程可以執(zhí)行的具體操作,并且根據(jù)URI權(quán)限授權(quán)臨時(shí)訪問特定的數(shù)據(jù)段。

          一、 安全架構(gòu)設(shè)計(jì)

          Android安全架構(gòu)的中心設(shè)計(jì)點(diǎn)是:
          在默認(rèn)情況下任何應(yīng)用都沒有權(quán)限執(zhí)行對(duì)其他應(yīng)用、操作系統(tǒng)或用戶有不利影響的任何操作。這包括讀取或?qū)懭胗脩舻乃接袛?shù)據(jù)(例如聯(lián)系人或電子郵件)、讀取或?qū)懭肫渌麘?yīng)用程序的文件、執(zhí)行網(wǎng)絡(luò)訪問、使設(shè)備保持喚醒狀態(tài)等。

          由于每個(gè)?Android?應(yīng)用都是在進(jìn)程沙盒中運(yùn)行,因此應(yīng)用必須顯式共享資源和數(shù)據(jù)。它們的方法是聲明需要哪些權(quán)限來(lái)獲取基本沙盒未提供的額外功能。應(yīng)用以靜態(tài)方式聲明它們需要的權(quán)限,然后Android?系統(tǒng)提示用戶同意。

          二、應(yīng)用簽名

          所有APK(.apk 文件)都必須使用證書簽署,其私鑰由開發(fā)者持有。此證書用于識(shí)別應(yīng)用的作者。證書不需要由證書頒發(fā)機(jī)構(gòu)簽署;Android應(yīng)用在理想情況下可以而且通常也是使用自簽名證書。證書在?Android?中的作用是識(shí)別應(yīng)用的作者。這允許系統(tǒng)授予或拒絕應(yīng)用對(duì)簽名級(jí)權(quán)限的訪問,以及授予或拒絕應(yīng)用獲得與另一應(yīng)用相同的?Linux身份的請(qǐng)求。

          比如:
          聲明一個(gè)安全權(quán)限,可用于限制對(duì)此或其他應(yīng)用程序的特定組件或功能的訪問。

          權(quán)限聲明

          三、用戶ID 和文件訪問

          在安裝時(shí),Android為每個(gè)軟件包提供唯一的?Linux?用戶?ID。此ID?在軟件包在該設(shè)備上的使用壽命期間保持不變。在不同設(shè)備上,相同軟件包可能有不同的?UID;重要的是每個(gè)軟件包在指定設(shè)備上的UID是唯一的。

          由于在進(jìn)程級(jí)實(shí)施安全性,因此任何兩個(gè)軟件包的代碼通常都不能在同一進(jìn)程中運(yùn)行,因?yàn)樗鼈冃枰鳛椴煌?Linux用戶運(yùn)行。您可以在每個(gè)軟件包的?AndroidManifest.xml?的?manifest?標(biāo)記中使用?sharedUserId?屬性,為它們分配相同的用戶ID。這樣做以后,出于安全目的,兩個(gè)軟件包將被視為同一個(gè)應(yīng)用,具有相同的用戶ID?和文件權(quán)限。

          為保持安全性,只有兩個(gè)簽署了相同簽名(并且請(qǐng)求相同的?sharedUserId)的應(yīng)用才被分配同一用戶ID

          應(yīng)用存儲(chǔ)的任何數(shù)據(jù)都會(huì)被分配該應(yīng)用的用戶ID,并且其他軟件包通常無(wú)法訪問這些數(shù)據(jù)。使用?getSharedPreferences(String, int)、openFileOutput(String, int)或?openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)創(chuàng)建新文件時(shí),可以使用?MODE_WORLD_READABLE或?MODE_WORLD_WRITEABLE標(biāo)記允許任何其他軟件包讀取/寫入文件。設(shè)置這些標(biāo)記時(shí),文件仍歸您的應(yīng)用所有,但其全局讀取和/或?qū)懭霗?quán)限已適當(dāng)設(shè)置,使任何其他應(yīng)用都可看見它。

          四、使用權(quán)限

          基本?Android應(yīng)用默認(rèn)情況下未關(guān)聯(lián)權(quán)限,這意味著它無(wú)法執(zhí)行對(duì)用戶體驗(yàn)或設(shè)備上任何數(shù)據(jù)產(chǎn)生不利影響的任何操作。要利用受保護(hù)的設(shè)備功能,必須在應(yīng)用清單中包含一個(gè)或多個(gè)?標(biāo)記。

          例如,需要監(jiān)控傳入的短信的應(yīng)用要指定:

          接收短信權(quán)限

          權(quán)限分類:

          • 正常權(quán)限

          不會(huì)對(duì)用戶隱私或設(shè)備操作造成很大風(fēng)險(xiǎn)的權(quán)限,系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限。

          • 危險(xiǎn)權(quán)限

          可能影響用戶隱私或設(shè)備正常操作的權(quán)限,系統(tǒng)會(huì)要求用戶明確授予這些權(quán)限,否則默認(rèn)不授予。

          注意:
          Android 6.0 之后(targetSdkVersion SDK 23之上)的版本,處于對(duì)手機(jī)用戶更安全的機(jī)制考慮,在應(yīng)用使用可能影響用戶隱私的危險(xiǎn)權(quán)限時(shí),需要?jiǎng)討B(tài)申請(qǐng)權(quán)限,必須用戶手動(dòng)授予權(quán)限才可以,僅在Androidmainfest.xml 中申請(qǐng)權(quán)限是不夠的。

          高版本Android系統(tǒng)中,如不動(dòng)態(tài)申請(qǐng)權(quán)限,則會(huì)報(bào)SecurityException的錯(cuò)誤,但不能保證每個(gè)地方都是這樣。例如,sendBroadcast(Intent)?方法在數(shù)據(jù)傳遞到每個(gè)接收者時(shí)會(huì)檢查權(quán)限,在方法調(diào)用返回后,即使權(quán)限失效,您也不會(huì)收到異常。但在幾乎所有情況下,權(quán)限失效會(huì)記入系統(tǒng)日志。

          特定使用權(quán)限場(chǎng)景

          • 在調(diào)用系統(tǒng)時(shí),防止應(yīng)用執(zhí)行某些功能。

          • 在啟動(dòng)?Activity時(shí),防止應(yīng)用啟動(dòng)其他應(yīng)用的?Activity

          • 在發(fā)送和接收廣播時(shí),控制誰(shuí)可以接收您的廣播,誰(shuí)可以向您發(fā)送廣播。

          • 在訪問和操作內(nèi)容提供程序時(shí)。

          • 綁定至服務(wù)或啟動(dòng)服務(wù)。

          五、正常權(quán)限和危險(xiǎn)權(quán)限

          • 1.正常權(quán)限涵蓋應(yīng)用需要訪問其沙盒外部數(shù)據(jù)或資源,但對(duì)用戶隱私或其他應(yīng)用操作風(fēng)險(xiǎn)很小的區(qū)域。例如,設(shè)置時(shí)區(qū)的權(quán)限就是正常權(quán)限。如果應(yīng)用聲明其需要正常權(quán)限,系統(tǒng)會(huì)自動(dòng)向應(yīng)用授予該權(quán)限。

          • 2.危險(xiǎn)權(quán)限涵蓋應(yīng)用需要涉及用戶隱私信息的數(shù)據(jù)或資源,或者可能對(duì)用戶存儲(chǔ)的數(shù)據(jù)或其他應(yīng)用的操作產(chǎn)生影響的區(qū)域。例如,能夠讀取用戶的聯(lián)系人屬于危險(xiǎn)權(quán)限。如果應(yīng)用聲明其需要危險(xiǎn)權(quán)限,則用戶必須明確向應(yīng)用授予該權(quán)限。

          • 3.權(quán)限組

          所有危險(xiǎn)的?Android系統(tǒng)權(quán)限都屬于權(quán)限組。

          • 如果應(yīng)用請(qǐng)求其清單中列出的危險(xiǎn)權(quán)限,而應(yīng)用目前在權(quán)限組中沒有任何權(quán)限,則系統(tǒng)會(huì)向用戶顯示一個(gè)對(duì)話框,描述應(yīng)用要訪問的權(quán)限組。對(duì)話框不描述該組內(nèi)的具體權(quán)限。例如,如果應(yīng)用請(qǐng)求?READ_CONTACTS?權(quán)限,系統(tǒng)對(duì)話框只說明該應(yīng)用需要訪問設(shè)備的聯(lián)系信息。如果用戶批準(zhǔn),系統(tǒng)將向應(yīng)用授予其請(qǐng)求的權(quán)限。

          • 如果應(yīng)用請(qǐng)求其清單中列出的危險(xiǎn)權(quán)限,而應(yīng)用在同一權(quán)限組中已有另一項(xiàng)危險(xiǎn)權(quán)限,則系統(tǒng)會(huì)立即授予該權(quán)限,而無(wú)需與用戶進(jìn)行任何交互。例如,如果某應(yīng)用已經(jīng)請(qǐng)求并且被授予了?READ_CONTACTS權(quán)限,然后它又請(qǐng)求?WRITE_CONTACTS,系統(tǒng)將立即授予該權(quán)限。

          任何權(quán)限都可屬于一個(gè)權(quán)限組,包括正常權(quán)限和應(yīng)用定義的權(quán)限。但權(quán)限組僅當(dāng)權(quán)限危險(xiǎn)時(shí)才影響用戶體驗(yàn)。可以忽略正常權(quán)限的權(quán)限組。

          危險(xiǎn)權(quán)限和權(quán)限組

          要實(shí)施您自己的權(quán)限,必須先使用一個(gè)或多個(gè)?元素在?AndroidManifest.xml中聲明它們。例如,想要控制誰(shuí)可以開始其中一個(gè)Activity?的應(yīng)用可如下所示聲明此操作的權(quán)限:

          自定義權(quán)限

          六、自定義權(quán)限

          • 如果要設(shè)計(jì)一套向彼此顯示功能的應(yīng)用,請(qǐng)盡可能將應(yīng)用設(shè)計(jì)為每個(gè)權(quán)限只定義一次。如果所有應(yīng)用并非使用同一證書簽署,則必須這樣做。即使所有應(yīng)用使用同一證書簽署,最佳做法也是每個(gè)權(quán)限只定義一次。

          • 如果功能僅適用于使用與提供應(yīng)用相同的簽名所簽署的應(yīng)用,您可能可以使用簽名檢查避免定義自定義權(quán)限。當(dāng)一個(gè)應(yīng)用向另一個(gè)應(yīng)用發(fā)出請(qǐng)求時(shí),第二個(gè)應(yīng)用可在遵從該請(qǐng)求之前驗(yàn)證這兩個(gè)應(yīng)用是否使用同一證書簽署。

          • 如果您要開發(fā)一套只在您自己的設(shè)備上運(yùn)行的應(yīng)用,則應(yīng)開發(fā)并安裝管理該套件中所有應(yīng)用權(quán)限的軟件包。此軟件包本身無(wú)需提供任何服務(wù)。它只是聲明所有權(quán)限,然后套件中的其他應(yīng)用通過元素請(qǐng)求這些權(quán)限。

          • 在 AndroidManifest.xml 中實(shí)施權(quán)限

          您可以通過AndroidManifest.xml應(yīng)用高級(jí)權(quán)限,限制訪問系統(tǒng)或應(yīng)用的全部組件。要執(zhí)行此操作,在所需的組件上包含?android:permission屬性,為用于控制訪問它的權(quán)限命名。

          • 1.Activity 權(quán)限

          (應(yīng)用于標(biāo)記)限制誰(shuí)可以啟動(dòng)相關(guān)的?Activity。在?Context.startActivity()和?Activity.startActivityForResult()時(shí)會(huì)檢查權(quán)限;如果調(diào)用方?jīng)]有所需的權(quán)限,則調(diào)用會(huì)拋出?SecurityException

          • 2 . Service 權(quán)限

          (應(yīng)用于?標(biāo)記)限制誰(shuí)可以啟動(dòng)或綁定到相關(guān)的服務(wù)。在?Context.startService()、Context.stopService()和?Context.bindService()時(shí)會(huì)檢查權(quán)限;如果調(diào)用方?jīng)]有所需的權(quán)限,則調(diào)用會(huì)拋出?SecurityException

          • 3 .BroadcastReceiver 權(quán)限

          (應(yīng)用于??標(biāo)記)限制誰(shuí)可以發(fā)送廣播給相關(guān)的接收方。在?Context.sendBroadcast()?返回后檢查權(quán)限,因?yàn)橄到y(tǒng)會(huì)嘗試將提交的廣播傳遞到指定的接收方。因此,權(quán)限失效不會(huì)導(dǎo)致向調(diào)用方拋回異常;只是不會(huì)傳遞該intent

          同樣,可以向?Context.registerReceiver()提供權(quán)限來(lái)控制誰(shuí)可以廣播到以編程方式注冊(cè)的接收方。另一方面,可以在調(diào)用?Context.sendBroadcast()時(shí)提供權(quán)限來(lái)限制允許哪些?BroadcastReceiver?對(duì)象接收廣播。

          • 4 .ContentProvider 權(quán)限

          (應(yīng)用于標(biāo)記)限制誰(shuí)可以訪問ContentProvider中的數(shù)據(jù)。(內(nèi)容提供程序有重要的附加安全工具可用,稱為?URI?權(quán)限,將在后面介紹。)與其他組件不同,您可以設(shè)置兩個(gè)單獨(dú)的權(quán)限屬性:android:readPermission限制誰(shuí)可以讀取提供程序,android:writePermission限制誰(shuí)可以寫入提供程序。

          請(qǐng)注意,如果提供程序有讀取和寫入權(quán)限保護(hù),僅擁有寫入權(quán)限并不表示您可以讀取提供程序。第一次檢索提供程序時(shí)將會(huì)檢查權(quán)限(如果沒有任何權(quán)限,將會(huì)拋出?SecurityException),對(duì)提供程序執(zhí)行操作時(shí)也會(huì)檢查權(quán)限。使用?ContentResolver.query()?需要擁有讀取權(quán)限;使用?ContentResolver.insert()、ContentResolver.update()、ContentResolver.delete()需要寫入權(quán)限。在所有這些情況下,沒有所需的權(quán)限將導(dǎo)致調(diào)用拋出?SecurityException

          七、動(dòng)態(tài)申請(qǐng)權(quán)限D(zhuǎn)emo

          • 實(shí)現(xiàn)效果如下:

          動(dòng)態(tài)申請(qǐng)權(quán)限

          引導(dǎo)用戶進(jìn)入Settings 中進(jìn)行手動(dòng)管理權(quán)限

          Settings 中權(quán)限管理

          • 實(shí)現(xiàn)代碼如下:

          public class PermissionActivity extends Activity {

          private static final int PERMISSION_REQUEST_CODE = 10000;

          String[] mPermissionsArrays = { Manifest.permission.READ_CONTACTS,
          Manifest.permission.READ_PHONE_STATE,
          Manifest.permission.WRITE_EXTERNAL_STORAGE };

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_permission);
          }

          @SuppressLint("NewApi")
          public void PermissionOnClick(View view) {

          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
          // Android 6.0 之下無(wú)須動(dòng)態(tài)申請(qǐng)權(quán)限 ,讓用戶手動(dòng)授權(quán)
          Toast.makeText(getApplicationContext(),
          "Android 6.0 以下版本不需要用戶手動(dòng)授權(quán)", 0).show();
          } else {

          boolean isAllGranted = checkPermissionAllGranted(mPermissionsArrays);
          // 如果已經(jīng)授權(quán),繼續(xù)執(zhí)行其他任務(wù)
          if (isAllGranted) {
          //
          Toast.makeText(getApplicationContext(), "已經(jīng)授權(quán)", 0).show();

          } else {
          // 沒有授權(quán)則開啟申請(qǐng)授權(quán)流程
          requestPermissions(mPermissionsArrays, PERMISSION_REQUEST_CODE);
          }
          }

          }

          /**
          * 檢查是否擁有指定的所有權(quán)限
          */

          @SuppressLint("NewApi")
          private boolean checkPermissionAllGranted(String[] permissions) {

          for (String permission : permissions) {
          if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
          // 只要有一個(gè)權(quán)限沒有被授予, 則直接返回 false
          return false;
          }
          }
          return true;
          }

          /***
          * 在授權(quán)權(quán)限返回結(jié)果時(shí)候 處理
          *
          * **/

          @Override
          public void onRequestPermissionsResult(int requestCode,
          String[] permissions, int[] grantResults) {

          if (requestCode == PERMISSION_REQUEST_CODE) {
          boolean isAllGranted = true;

          for (int grant : grantResults) {
          if (grant != PackageManager.PERMISSION_GRANTED) {
          isAllGranted = false;
          break;
          }
          }
          if (isAllGranted) {
          // 如果所有的權(quán)限都授予了, 則執(zhí)行備份代碼
          Toast.makeText(getApplicationContext(), "已經(jīng)授權(quán)", 0).show();
          } else {

          // 彈出對(duì)話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動(dòng)打開權(quán)限按鈕
          openPermissionsDialog();
          }
          }
          }

          private void openPermissionsDialog() {

          AlertDialog.Builder builder = new AlertDialog.Builder(this,
          android.R.style.Theme_Material_Light_Dialog_Alert);
          builder.setMessage("需要獲取 聯(lián)系人、 SD卡、手機(jī)狀態(tài)權(quán)限 ,請(qǐng)?jiān)试S授權(quán),否則會(huì)影響您的使用。如需關(guān)閉,請(qǐng)到 設(shè)置-應(yīng)用信息 -> 權(quán)限 中關(guān)閉!");
          builder.setPositiveButton("去手動(dòng)授權(quán)",
          new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {

          Intent intent = new Intent();
          intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
          intent.addCategory(Intent.CATEGORY_DEFAULT);
          intent.setData(Uri.parse("package:" + getPackageName()));
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
          intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

          startActivity(intent);
          }
          });
          builder.setNegativeButton("取消", null);
          builder.show();
          }
          }

          注意:需要在AndroidMainfest.xml 中申請(qǐng)權(quán)限

          AndroidMainfest.xml 中聲明權(quán)限

          至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除。同時(shí)感謝您的閱讀,期待您的關(guān)注。

          瀏覽 109
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲成人MV| a在线免费 | 操久在线| 色色色色综合 | 日本熟女性爱视频 |