<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Android復(fù)習(xí)(四)權(quán)限—>請(qǐng)求應(yīng)用權(quán)限

      每款 Android 應(yīng)用都在訪問受限的沙盒中運(yùn)行。如果應(yīng)用需要使用其自己的沙盒外的資源或信息,則必須請(qǐng)求相應(yīng)權(quán)限。 要聲明您的應(yīng)用需要某項(xiàng)權(quán)限,您可以在應(yīng)用清單中列出該權(quán)限,然后在運(yùn)行時(shí)請(qǐng)求用戶批準(zhǔn)每項(xiàng)權(quán)限(適用于 Android 6.0 及更高版本)。

      本頁介紹如何使用 Android 支持庫來檢查和請(qǐng)求權(quán)限。Android 框架從 Android 6.0(API 級(jí)別 23)開始提供類似的方法,但如果使用支持庫,將會(huì)更容易與較低的 Android 版本實(shí)現(xiàn)兼容性。

      向清單添加權(quán)限

      對(duì)于所有 Android 版本,要聲明應(yīng)用需要某項(xiàng)權(quán)限,請(qǐng)?jiān)趹?yīng)用清單中添加 <uses-permission> 元素,作為頂級(jí) <manifest> 元素的子項(xiàng)。例如,需要訪問互聯(lián)網(wǎng)的應(yīng)用需在清單中添加以下代碼行:

          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                  package="com.example.snazzyapp">
      
              <uses-permission android:name="android.permission.INTERNET"/>
              <!-- other permissions go here -->
      
              <application ...>
                  ...
              </application>
          </manifest>
      

       

      系統(tǒng)在您聲明權(quán)限之后的行為取決于權(quán)限的敏感程度。有些權(quán)限被視為“常規(guī)”權(quán)限,因此系統(tǒng)會(huì)在安裝應(yīng)用時(shí)立即授予這些權(quán)限。還有些則被視為“危險(xiǎn)”權(quán)限,因此需要用戶明確向您的應(yīng)用授予相應(yīng)訪問權(quán)限。如需詳細(xì)了解不同類型的權(quán)限,請(qǐng)參閱保護(hù)級(jí)別。

      檢查權(quán)限

      如果應(yīng)用需要一項(xiàng)危險(xiǎn)權(quán)限,那么每次執(zhí)行需要該權(quán)限的操作時(shí),您都必須檢查自己是否具有該權(quán)限。從 Android 6.0(API 級(jí)別 23)開始,用戶可隨時(shí)從任何應(yīng)用撤消權(quán)限,即使應(yīng)用以較低的 API 級(jí)別為目標(biāo)平臺(tái)也是如此。因此,即使應(yīng)用昨天使用了相機(jī),也不能認(rèn)為它今天仍具有該權(quán)限。

      要檢查您是否具有某項(xiàng)權(quán)限,請(qǐng)調(diào)用 ContextCompat.checkSelfPermission() 方法。例如,以下代碼段展示了如何檢查 Activity 是否具有向日歷寫入數(shù)據(jù)的權(quán)限:


         
      java代碼:
      
          if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
                  != PackageManager.PERMISSION_GRANTED) {
              // Permission is not granted
          }
          
      
      kotlin代碼:
      
          if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
                  != PackageManager.PERMISSION_GRANTED) {
              // Permission is not granted
          }
          
      

        

      如果應(yīng)用具有此權(quán)限,該方法將返回 PERMISSION_GRANTED,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具備此權(quán)限,該方法將返回 PERMISSION_DENIED,且應(yīng)用必須明確要求用戶授予權(quán)限。

      請(qǐng)求權(quán)限

      當(dāng)您的應(yīng)用從 checkSelfPermission() 收到 PERMISSION_DENIED 時(shí),您需要提示用戶授予該權(quán)限。Android 為您提供了幾種可用來請(qǐng)求權(quán)限的方法(如 requestPermissions()),如下面的代碼段所示。調(diào)用這些方法時(shí),會(huì)顯示一個(gè)無法自定義的標(biāo)準(zhǔn) Android 對(duì)話框。

      如何向用戶顯示此內(nèi)容取決于設(shè)備的 Android 版本以及應(yīng)用的目標(biāo)版本,如權(quán)限概覽中所述。

      解釋為什么應(yīng)用需要權(quán)限

      在某些情況下,您需要幫助用戶理解為什么您的應(yīng)用需要某項(xiàng)權(quán)限。例如,如果用戶啟動(dòng)一款攝影應(yīng)用,用戶或許不會(huì)對(duì)該應(yīng)用請(qǐng)求使用相機(jī)的權(quán)限感到驚訝,但用戶可能不理解為什么該應(yīng)用想要訪問用戶的位置或聯(lián)系人。在您的應(yīng)用請(qǐng)求權(quán)限之前,不妨考慮向用戶提供解釋。請(qǐng)注意,您肯定不希望您的解釋讓用戶不勝其煩;如果您提供太多解釋,用戶可能會(huì)覺得這款應(yīng)用很麻煩,因而將其移除。

      您可以使用的一種方法是只在用戶之前拒絕過該權(quán)限請(qǐng)求的情況下才提供解釋。Android 提供了一種實(shí)用程序方法,即 shouldShowRequestPermissionRationale()。如果用戶之前拒絕了該請(qǐng)求,該方法將返回 true;如果用戶之前拒絕了某項(xiàng)權(quán)限并且選中了權(quán)限請(qǐng)求對(duì)話框中的不再詢問選項(xiàng),或者如果設(shè)備政策禁止該權(quán)限,該方法將返回 false。

      如果用戶不斷嘗試使用需要某項(xiàng)權(quán)限的功能,但一直拒絕權(quán)限請(qǐng)求,這或許意味著,用戶不理解為什么應(yīng)用需要該權(quán)限才能提供這項(xiàng)功能。在這種情況下,顯示解釋或許是不錯(cuò)的做法。

      應(yīng)用權(quán)限最佳做法中提供了更多建議,指導(dǎo)您如何在請(qǐng)求權(quán)限時(shí)創(chuàng)造良好的用戶體驗(yàn)。

      在必要時(shí)請(qǐng)求成為默認(rèn)處理程序

      有些應(yīng)用依賴于訪問與通話記錄和短信有關(guān)的敏感用戶信息。如果您想請(qǐng)求特定于通話記錄和短信的權(quán)限,并將應(yīng)用發(fā)布到 Play 商店,則必須在請(qǐng)求這些運(yùn)行時(shí)權(quán)限之前提示用戶將應(yīng)用設(shè)置為“默認(rèn)處理程序”以獲得核心系統(tǒng)功能。

      如需詳細(xì)了解默認(rèn)處理程序(包括有關(guān)如何向用戶顯示默認(rèn)處理程序提示的指南),請(qǐng)參閱有關(guān)僅在默認(rèn)處理程序中使用的權(quán)限的指南。

      請(qǐng)求您需要的權(quán)限

      如果您的應(yīng)用還不具備它需要的權(quán)限,那么它必須調(diào)用一個(gè) requestPermissions() 方法來請(qǐng)求相應(yīng)權(quán)限。您的應(yīng)用將傳遞它想要的權(quán)限,以及您指定用于識(shí)別此權(quán)限請(qǐng)求的整數(shù)請(qǐng)求代碼。此方法異步運(yùn)行。它會(huì)立即返回結(jié)果,并且在用戶響應(yīng)提示后,系統(tǒng)會(huì)利用相應(yīng)結(jié)果來調(diào)用應(yīng)用的回調(diào)方法,在調(diào)用過程中傳遞的請(qǐng)求代碼與應(yīng)用傳遞給 requestPermissions() 的請(qǐng)求代碼相同。

      以下代碼將檢查應(yīng)用是否具有讀取用戶聯(lián)系人的權(quán)限。如果沒有該權(quán)限,它會(huì)檢查是否應(yīng)顯示需要該權(quán)限的解釋,如果不需要解釋,它會(huì)請(qǐng)求該權(quán)限:

      java代碼:
      
          // Here, thisActivity is the current activity
          if (ContextCompat.checkSelfPermission(thisActivity,
                  Manifest.permission.READ_CONTACTS)
                  != PackageManager.PERMISSION_GRANTED) {
      
              // Permission is not granted
              // Should we show an explanation?
              if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                      Manifest.permission.READ_CONTACTS)) {
                  // Show an explanation to the user *asynchronously* -- don't block
                  // this thread waiting for the user's response! After the user
                  // sees the explanation, try again to request the permission.
              } else {
                  // No explanation needed; request the permission
                  ActivityCompat.requestPermissions(thisActivity,
                          new String[]{Manifest.permission.READ_CONTACTS},
                          MY_PERMISSIONS_REQUEST_READ_CONTACTS);
      
                  // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                  // app-defined int constant. The callback method gets the
                  // result of the request.
              }
          } else {
              // Permission has already been granted
          }
          
      
      kotlin代碼:
      
          // Here, thisActivity is the current activity
          if (ContextCompat.checkSelfPermission(thisActivity,
                  Manifest.permission.READ_CONTACTS)
                  != PackageManager.PERMISSION_GRANTED) {
      
              // Permission is not granted
              // Should we show an explanation?
              if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                      Manifest.permission.READ_CONTACTS)) {
                  // Show an explanation to the user *asynchronously* -- don't block
                  // this thread waiting for the user's response! After the user
                  // sees the explanation, try again to request the permission.
              } else {
                  // No explanation needed, we can request the permission.
                  ActivityCompat.requestPermissions(thisActivity,
                          arrayOf(Manifest.permission.READ_CONTACTS),
                          MY_PERMISSIONS_REQUEST_READ_CONTACTS)
      
                  // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                  // app-defined int constant. The callback method gets the
                  // result of the request.
              }
          } else {
              // Permission has already been granted
          }
          
      

        

       

      系統(tǒng)顯示的提示說明了您的應(yīng)用需要訪問的權(quán)限組,而不是具體權(quán)限。

      注意:當(dāng)您的應(yīng)用調(diào)用 requestPermissions() 時(shí),系統(tǒng)會(huì)向用戶顯示一個(gè)標(biāo)準(zhǔn)對(duì)話框。您的應(yīng)用無法配置或更改該對(duì)話框。如果您需要向用戶提供任何信息或解釋,您應(yīng)該在調(diào)用 requestPermissions() 之前這樣做,如解釋為什么應(yīng)用需要權(quán)限中所述。

      處理權(quán)限請(qǐng)求響應(yīng)

      當(dāng)用戶響應(yīng)您應(yīng)用的權(quán)限請(qǐng)求時(shí),系統(tǒng)會(huì)調(diào)用您應(yīng)用的 onRequestPermissionsResult() 方法,在調(diào)用過程中向其傳遞用戶響應(yīng)。您的應(yīng)用必須替換該方法,以查明是否已向其授予相應(yīng)權(quán)限。在回調(diào)過程中傳遞的請(qǐng)求代碼與傳遞給 requestPermissions() 的請(qǐng)求代碼相同。例如,如果應(yīng)用請(qǐng)求 READ_CONTACTS 訪問權(quán)限,則它可能采用以下回調(diào)方法:

      java代碼:
      
          @Override
          public void onRequestPermissionsResult(int requestCode,
                  String[] permissions, int[] grantResults) {
              switch (requestCode) {
                  case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                      // If request is cancelled, the result arrays are empty.
                      if (grantResults.length > 0
                          && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                          // permission was granted, yay! Do the
                          // contacts-related task you need to do.
                      } else {
                          // permission denied, boo! Disable the
                          // functionality that depends on this permission.
                      }
                      return;
                  }
      
                  // other 'case' lines to check for other
                  // permissions this app might request.
              }
          }
      
      kotlin代碼:
      
          override fun onRequestPermissionsResult(requestCode: Int,
                  permissions: Array<String>, grantResults: IntArray) {
              when (requestCode) {
                  MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
                      // If request is cancelled, the result arrays are empty.
                      if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                          // permission was granted, yay! Do the
                          // contacts-related task you need to do.
                      } else {
                          // permission denied, boo! Disable the
                          // functionality that depends on this permission.
                      }
                      return
                  }
      
                  // Add other 'when' lines to check for other
                  // permissions this app might request.
                  else -> {
                      // Ignore all other requests.
                  }
              }
          }
          
      

        

       

      系統(tǒng)顯示的對(duì)話框說明了您的應(yīng)用需要訪問的權(quán)限組,它不會(huì)列出具體權(quán)限。例如,如果請(qǐng)求 READ_CONTACTS 權(quán)限,系統(tǒng)對(duì)話框只會(huì)說明您的應(yīng)用需要訪問設(shè)備的聯(lián)系人。用戶只需要針對(duì)每個(gè)權(quán)限組授予一次權(quán)限。如果您的應(yīng)用請(qǐng)求該組中的其他任何權(quán)限(已在您的應(yīng)用清單中列出),系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限。當(dāng)您請(qǐng)求權(quán)限時(shí),系統(tǒng)會(huì)調(diào)用您的 onRequestPermissionsResult() 回調(diào)方法并傳遞 PERMISSION_GRANTED,就像用戶通過系統(tǒng)對(duì)話框明確同意了您的請(qǐng)求時(shí)的處理方式一樣。

      注意:您的應(yīng)用仍需要明確請(qǐng)求它需要的每項(xiàng)權(quán)限,即使用戶已授予同一組中的其他權(quán)限。此外,權(quán)限分組在將來的 Android 版本中可能會(huì)發(fā)生變化。您的代碼不應(yīng)依賴于特定權(quán)限屬于或不屬于同一組的假設(shè)。

      例如,假設(shè)您在應(yīng)用清單中同時(shí)列出了 READ_CONTACTS 和 WRITE_CONTACTS。如果您請(qǐng)求 READ_CONTACTS 且用戶授予了該權(quán)限,那么當(dāng)您隨后又請(qǐng)求 WRITE_CONTACTS 時(shí),系統(tǒng)會(huì)立即授予您該權(quán)限,而無需與用戶交互。

      如果用戶拒絕了權(quán)限請(qǐng)求,您的應(yīng)用應(yīng)采取適當(dāng)?shù)拇胧?。例如,您的?yīng)用可能會(huì)顯示一個(gè)對(duì)話框,解釋它為什么無法執(zhí)行用戶請(qǐng)求的需要該權(quán)限的操作。

      當(dāng)系統(tǒng)要求用戶授予某項(xiàng)權(quán)限時(shí),用戶可以選擇告知系統(tǒng)不要再次請(qǐng)求該權(quán)限。在這種情況下,只要應(yīng)用使用 requestPermissions() 再次請(qǐng)求該權(quán)限,系統(tǒng)就會(huì)立即拒絕請(qǐng)求。系統(tǒng)會(huì)調(diào)用您的 onRequestPermissionsResult() 回調(diào)方法并傳遞 PERMISSION_DENIED,就像用戶再次明確拒絕了您的請(qǐng)求時(shí)的處理方式一樣。如果設(shè)備政策禁止應(yīng)用具有該權(quán)限,該方法也會(huì)返回 false。這意味著,當(dāng)您調(diào)用 requestPermissions() 時(shí),您不能假定已經(jīng)發(fā)生與用戶的任何直接交互。

      要在請(qǐng)求應(yīng)用權(quán)限時(shí)提供最佳用戶體驗(yàn),另請(qǐng)參閱應(yīng)用權(quán)限最佳做法

      按 API 級(jí)別聲明權(quán)限

      要僅在支持運(yùn)行時(shí)權(quán)限的設(shè)備(即運(yùn)行 Android 6.0(API 級(jí)別 23)或更高版本的設(shè)備)上聲明某項(xiàng)權(quán)限,請(qǐng)?zhí)砑?nbsp;uses- permission-sdk-23 標(biāo)記,而不是 uses-permission 標(biāo)記。

      使用這些標(biāo)記中的任意一個(gè)時(shí),您均可設(shè)置 maxSdkVersion 屬性,以指定在運(yùn)行更高版本的設(shè)備上不需要特定權(quán)限。

      posted @ 2020-04-03 15:34  王世楨  閱讀(892)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 日韩精品一二三黄色一级| 久久AV中文综合一区二区| 奉节县| 视频一区二区三区刚刚碰| 久久精品无码免费不卡| 国产精品免费视频网站| 日本边添边摸边做边爱喷水| 2020年最新国产精品正在播放| 97香蕉碰碰人妻国产欧美| 国产成人精品一区二区无| 免费又大粗又爽又黄少妇毛片| 性xxxx视频播放免费| 无码日韩精品一区二区免费| 亚洲最大成人在线播放| 这里只有精品免费视频| 欧美人与动牲交a免费| 最新国产精品中文字幕| 亚洲a成人片在线观看| 乱码精品一区二区亚洲区| 亚洲欧美人成网站在线观看看| 麻豆一区二区三区精品视频| 精品午夜福利在线视在亚洲| 亚洲美免无码中文字幕在线| 一边吃奶一边做动态图| 天堂av资源在线免费| 天美传媒xxxxhd videos3| 高级艳妇交换俱乐部小说| 亚洲国产精品日韩在线| 无套内射极品少妇chinese| 高清中文字幕国产精品| 免费无码黄网站在线观看| 97人人模人人爽人人喊网| 日韩卡一卡2卡3卡4卡| 国产成人精品中文字幕| 成人网站免费观看| 亲子乱aⅴ一区二区三区| 一区二区三区激情都市| 昌江| 亚洲欧美人成人综合在线播放| 久久精品国产亚洲夜色AV网站| 久青草国产在视频在线观看|