Android 許可權處理

來源:互聯網
上載者:User

標籤:should   api   審批   for   klist   waiting   pack   err   contex   

概述:

為了保護系統的完整性和使用者隱私權,Android 在訪問受限的沙箱中運行每款應用。

如果應用需要使用其沙箱以外的資源或資訊,則必須明確請求許可權。

根據應用請求的權限類別型,系統可能會自動授予許可權,也可能會要求使用者授予許可權。

許可權最佳做法:

1.考慮使用intent 例子:[email protected] this.startActivityForResult(takeIntent, 1) -- 這個優先,使用簡單方便

2.如果使用許可權

  1. 僅要求您需要的許可權,不要要求太多;
  2. 在需要的地方申請許可權,而不是一次性申請;
  3. 解釋需要許可權的原因不要冗長;
  4. 拒絕許可權需要有對應提示。
優缺點:如果使用許可權:

您的應用可在您執行操作時完全控制使用者體驗。不過,如此廣泛的控制會增加任務的複雜性,因為您需要設計適當的 UI。

系統會在運行或安裝應用時各提示使用者提供一次許可權(具體取決於使用者的 Android 版本)。之後,應用即可執行操作,不再需要使用者進行其他互動。不過,如果使用者不授予許可權(或稍後撤銷許可權),您的應用將根本無法執行操作。

如果使用 intent:

您無需為操作設計 UI。處理 intent 的應用將提供 UI。不過,這意味著您無法控制使用者體驗。使用者可能與您從未見過的應用互動。

如果使用者沒有適用於操作的預設應用,則系統會提示使用者選擇一款應用。如果使用者未指定預設處理常式,則他們每次執行此操作時都必須處理一個額外對話方塊。


使用許可權做法:

1.在應用清單中聲明需要的許可權。

  1.1 在所有版本的 Android 中,您的應用都需要在其應用清單中同時聲明它需要的正常許可權和危險許可權。

2.運行時請求使用者授予許可權。僅適用於運行 Android 6.0(API 層級 23)及更高版本的裝置上的應用。

  2.1 系統在您聲明許可權之後的行為取決於許可權的敏感性。如果許可權不影響使用者隱私權,系統會自動授權。

    如果許可權可能涉及對敏感使用者資訊的訪問,系統將要求使用者核准請求。

    要瞭解有關不同種類許可權的詳細資料,請參閱正常許可權和危險許可權。

  2.2 使用 Android 支援庫來檢查和請求許可權。Android 架構從 Android 6.0(API 層級 23)開始提供類似方法。

    不過,使用支援庫更簡單,因為在調用方法前,您的應用不需要檢查它在哪個版本的 Android 上運行。

    (appcompat 庫,通常情況下,名稱以 …Compat(如 ActivityCompat)結束的類即是如此。)

2.3 要檢查您是否具有某項許可權,請調用 ContextCompat.checkSelfPermission() 方法。

  例如,以下程式碼片段顯示了如何檢查 Activity 是否具有在日曆中進行寫入的許可權:

  // Assume thisActivity is the current activity

  int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);

  如果應用具有此許可權,方法將返回 PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。如果應用不具有此許可權,方法將返回 PERMISSION_DENIED,且應用必須明確向使用者要求許可權。

package pers.hbolin.permissionsdemoimport android.Manifestimport android.app.Activityimport android.content.pm.PackageManagerimport android.support.v7.app.AppCompatActivityimport android.os.Bundleimport android.support.v4.app.ActivityCompatimport android.support.v4.content.ContextCompatimport android.support.v7.app.AlertDialogimport android.util.Logimport kotlinx.android.synthetic.main.activity_main.*import android.provider.MediaStoreimport android.content.Intentimport android.graphics.Bitmapclass MainActivity : AppCompatActivity() {    val TAG = "MainActivity"    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        callReadContacts()        button.setOnClickListener {            // 使用Intent,可以不用在AndroidManifest.xml中配置許可權            // 也不需要動態配置許可權,即可調用            // 這裡缺少判斷,是否有東西響應這個Intent,不然會拋出異常的。            val takeIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)            [email protected] this.startActivityForResult(takeIntent, 1)        }    }    // 請求許可權    private fun callReadContacts() {        // Here, thisActivity is the current activity        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {            Log.d(TAG, "未擷取到許可權")            // Should we show an explanation?            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {                // Show an expanation 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.                Log.d(TAG, "解釋為什麼需要許可權")                val builder = AlertDialog.Builder(this)                builder.setTitle("解釋為什麼需要許可權")                        .setMessage("因為是在測試")                        .setPositiveButton("確定") { _, _ ->                            // 申請許可權                            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), 1)                        }                        .setNegativeButton("取消") { _, _ -> }                        .create().show()            } else {                // No explanation needed, we can request the permission.                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), 1)                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an                // app-defined int constant. The callback method gets the                // result of the request.            }        } else {            Log.d(TAG, "已擷取到許可權")        }    }    // 請求回調    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {        if (requestCode == 1) {            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                Log.d(TAG, "許可權同意")            } else {                Log.d(TAG, "許可權禁止")            }        }    }    // startActivityForResult 回調    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        Log.d(TAG, "請求 $requestCode and 結果 $resultCode and data is null :${data == null}")        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {            if (data?.hasExtra("data") == true) {                Log.i(TAG, "data is not null")                val bitmap = data.getParcelableExtra<Bitmap>("data")                Log.d(TAG, "bitmap.width is ${bitmap.width}")                imageView.setImageBitmap(bitmap) //imageView即為當前頁面需要展示照片的控制項,可替換            }        }    }}

 

Android 許可權處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.