Android動態申請權限,讓你的應用更加安全和用戶友好

一、為什麼需要動態申請權限?

在Android移動設備上,權限是一項非常重要的安全特性。應用需要獲得用戶授權才能訪問特定的設備功能或用戶信息。根據不同的功能,權限可分為正常權限和危險權限兩種。

正常權限通常是指運行應用所必需的權限,如訪問網絡狀態等。這些權限會在安裝應用時自動授予,用戶不需要進行確認。

而危險權限則是指對用戶個人信息和設備重要功能進行訪問的權限,比如讀取聯繫人、讀取短信等。這些權限需要用戶明確授權才能使用。Android 6.0(API 23)引入了動態權限模型,允許用戶在應用運行時動態地授權這些危險權限。

使用動態權限申請,能保護用戶隱私安全,提高應用用戶友好度,避免用戶對應用的不信任感,增加用戶與應用的互動,提高應用的用戶活躍度,從而提高應用評分和推廣度。

二、如何執行動態申請權限

Android雖然提供了權限管理,但是某些應用運行時可能需要並未在manifest文件中包含的新權限,因此需要動態申請權限。

如下是一個運用動態權限申請的應用示例,其實現為讓用戶在使用應用期間打開相機並捕捉照片的功能。

public class MainActivity extends AppCompatActivity {

private static final int REQUEST_CAMERA_PERMISSION = 1;
private static final int REQUEST_CAMERA = 2;

private Camera mCamera;

private boolean hasCameraPermission() {
// Check if the Camera permission has been granted
return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
}

private void requestCameraPermission() {
// Request the Camera permission
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
new ConfirmationDialog().show(getFragmentManager(), FRAGMENT_DIALOG);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}

private void requestCamera() {
// Request to launch the Camera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (hasCameraPermission()) {
requestCamera();
} else {
requestCameraPermission();
}
}
});

// Open the camera when the app is launched
if (hasCameraPermission()) {
requestCamera();
} else {
requestCameraPermission();
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CAMERA_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestCamera();
} else {
Toast.makeText(this, "You need to grant permission to use the camera", Toast.LENGTH_SHORT).show();
}
break;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CAMERA:
if (resultCode == RESULT_OK) {
// Save the captured image
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
ImageView imageView = findViewById(R.id.image_view);
imageView.setImageBitmap(bitmap);
}
break;
}
}

public static class ConfirmationDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Fragment parent = getParentFragment();
return new AlertDialog.Builder(getActivity())
.setMessage("Need permission to use the camera")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
FragmentCompat.requestPermissions(parent, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
}
}
}

上述代碼中,首先定義了應用所需的危險權限“CAMERA”和requestCode,然後使用hasCameraPermission()判斷是否獲得授權。如果未獲得權限,則使用requestCameraPermission()方法向系統發出權限請求,如果已獲得授權,則使用requestCamera()方法請求打開相機。
當用戶按下拍照按鈕後,onActivityResult()會接收請求的結果。如果結果是OK,表示照片已捕捉到。否則,用戶可能取消了該動作或者出現了問題。

三、優化動態申請權限的用戶體驗

儘管動態權限申請提升了應用的用戶體驗,但是在用戶授權的途中,用戶可能會遇到多次重複授權的問題,這會降低用戶對應用的滿意度。為了緩解用戶對彈出請求的強烈反感及讓用戶更好的理解對應用所需授權的必要性,我們可以採取如下幾種方式來優化用戶體驗。

1. 顯示完整的證明

為了更好地避免用戶對應用的不信任感,設備令生產商和廠商提供了“應用設置”中關於應用所需權限的描述。為了提高用戶對權限描述的理解和透明度,我們可以在彈出框中顯示完整的證明。

public class MainActivity extends AppCompatActivity {

private void requestCameraPermission() {
// Request the Camera permission
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// Explain to the user why we need permission
Snackbar.make(findViewById(android.R.id.content), "Need permission to use the camera for taking pictures", Snackbar.LENGTH_LONG).setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}).show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}
}

上述代碼中,使用Snackbar進行證明說明,將對話框內容從簡單的“A“更新為有用的描述。同時,添加了一個”OK”按鈕來開始授權請求。

2. 在請求過程中展示進度

當系統請求權限時,等待是不可避免的。但是,我們可以在會話過程中顯示一個進度條,以便用戶有時間了解發生了什麼。

public class MainActivity extends AppCompatActivity {

private ProgressDialog mProgressDialog;

private void requestCameraPermission() {
// Show a progress bar while the app requests permission
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// Explain to the user why we need permission
showCameraPermissionExplanation();
} else {
showProgressBar();
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}

private void showProgressBar() {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Requesting permission");
mProgressDialog.setCancelable(false);
mProgressDialog.setIndeterminate(true);
mProgressDialog.show();
}

private void cancelProgressBar() {
mProgressDialog.cancel();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
cancelProgressBar();
switch (requestCode) {
case REQUEST_CAMERA_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestCamera();
} else {
Toast.makeText(this, "You need to grant permission to use the camera", Toast.LENGTH_SHORT).show();
}
break;
}
}
}

上述代碼中,使用ProgressDialog來顯示進度條。在permission請求結束後,使用cancelProgressBar()方法取消進度條,展示授權請求結果。同時,在onRequestPermissionsResult()中使用cancelProgressBar()取消進度條。

3. 向用戶解釋為什麼需要特定的權限

當用戶拒絕授權時,可以向用戶展示為什麼需要該權限,以便幫助解釋需要的原因。

public class MainActivity extends AppCompatActivity {

private void requestCameraPermission() {
// Request the Camera permission
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// Explain to the user why we need permission
showCameraPermissionExplanation();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}

private void showCameraPermissionExplanation() {
new AlertDialog.Builder(this).setTitle("Need permission to use the camera").setMessage("This app needs the camera permission in order to take pictures.").setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}).setNegativeButton("Cancel", null)
.show();
}
}

上述代碼中,在shouldShowRequestPermissionRationale()返回true時,首先創建一個AlertDialog以向用戶解釋為什麼需要權限,然後提供一個“OK”按鈕,以便用戶開始授權請求。

四、總結

採用動態權限申請方式,可以保護用戶隱私安全,提高應用用戶友好度,避免用戶對應用的不信任感,增加用戶與應用的互動,提高應用的用戶活躍度,
從而提高應用評分和推廣度。優化動態權限申請的用戶體驗,能緩解用戶對彈出請求的反感,提高用戶對應用的滿意度。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/232085.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 12:50
下一篇 2024-12-11 12:50

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • QML 動態加載實踐

    探討 QML 框架下動態加載實現的方法和技巧。 一、實現動態加載的方法 QML 支持從 JavaScript 中動態指定需要加載的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • 掌握magic-api item.import,為你的項目注入靈魂

    你是否曾經想要導入一個模塊,但卻不知道如何實現?又或者,你是否在使用magic-api時遇到了無法導入的問題?那麼,你來到了正確的地方。在本文中,我們將詳細闡述magic-api的…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • Codemaid插件——讓你的代碼優美整潔

    你是否曾為了混雜在代碼里的冗餘空格、重複代碼而感到煩惱?你是否曾因為代碼缺少注釋而陷入困境?為了解決這些問題,今天我要為大家推薦一款Visual Studio擴展插件——Codem…

    編程 2025-04-28
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • 使用easypoi創建多個動態表頭

    本文將詳細介紹如何使用easypoi創建多個動態表頭,讓表格更加靈活和具有可讀性。 一、創建單個動態表頭 easypoi是一個基於POI操作Excel的Java框架,支持通過註解的…

    編程 2025-04-28
  • Python動態輸入: 從基礎使用到應用實例

    Python是一種高級編程語言,因其簡單易學和可讀性而備受歡迎。Python允許程序員通過標準輸入或命令行獲得用戶輸入,這使得Python語言無法預測或控制輸入。在本文中,我們將詳…

    編程 2025-04-28
  • 如何選擇MySQL服務器文件權限

    MySQL是一種流行的關係型數據庫管理系統。在安裝MySQL時,選擇正確的文件權限是保證安全和性能的重要步驟。以下是一些指導您選擇正確權限的建議。 一、權限選擇 MySQL服務器需…

    編程 2025-04-27
  • Python左補0,讓你的數據更美觀

    本文將從以下幾個方面,詳細闡述Python左補0的作用及使用方法: 一、什麼是Python左補0 在Python中,數據在輸出時如果希望達到一定的美觀效果,就需要對數字進行左補0,…

    編程 2025-04-27

發表回復

登錄後才能評論