Android 系统 App 如何申请权限弹框

在 Android 开发中,申请权限是应用正常运行的重要环节。从 Android 6.0(API 级别 23)开始,Android 引入了运行时权限机制,开发者必须在应用运行时请求用户授权特定权限。本文将详细讲解如何在 Android 系统中申请权限弹框,并通过示例代码展示如何实现这一过程。

一、背景介绍

在不同行动设备上,权限的使用和管理有所不同。为了提高用户对隐私的保护,Android 允许用户在应用运行时授权或拒绝某些敏感权限。常见的敏感权限包括读取联系人、访问相机、获取位置等。因此,开发者需要遵循系统规定,进行权限申请。

二、申请权限的步骤

  1. 在 Manifest 文件中声明权限
  2. 检查权限是否已被授予
  3. 请求用户授权
  4. 处理用户的授权结果
1. 在 Manifest 文件中声明权限

首先,开发者需要在应用的 AndroidManifest.xml 文件中声明所需的权限。例如,如果应用需要访问用户的相机权限,需添加以下代码:

<manifest xmlns:android="
    package="com.example.myapp">

    <uses-permission android:name="android.permission.CAMERA"/>
    
    <application
        ...
    </application>
</manifest>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
2. 检查权限是否已被授予

在应用的特定功能中,开发者需要检测当前权限状态。可以利用 ContextCompat.checkSelfPermission() 方法来判断权限是否被授予:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    // 权限未被授予
}
  • 1.
  • 2.
  • 3.
  • 4.
3. 请求用户授权

如果权限未被授予,开发者可以调用 ActivityCompat.requestPermissions() 方法请求授权。例如,在一个按钮点击事件中请求相机权限:

private static final int CAMERA_PERMISSION_CODE = 100;

btnRequestPermission.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE);
        } else {
            // 权限已经被授予
        }
    }
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
4. 处理用户的授权结果

用户选择后,系统会调用 onRequestPermissionsResult() 方法来反馈结果。开发者可以覆盖该方法来处理用户的选择:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case CAMERA_PERMISSION_CODE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户授权了相机权限
            } else {
                // 用户拒绝了相机权限
            }
            return;
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

三、权限申请的序列图

以下是权限申请过程的序列图,展示了用户、应用和系统之间的交互。

System App User System App User alt [权限未授予] [权限已授予] 点击申请权限 检查权限 显示权限请求弹框 选择授权或拒绝 返回结果 显示结果 权限已授予

四、完整示例代码

综合以上步骤,以下是一个完整的 MainActivity 示例代码:

public class MainActivity extends AppCompatActivity {
    private static final int CAMERA_PERMISSION_CODE = 100;
    private Button btnRequestPermission;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        btnRequestPermission = findViewById(R.id.btnRequestPermission);
        btnRequestPermission.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE);
                } else {
                    Toast.makeText(MainActivity.this, "权限已经被授予", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_PERMISSION_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "权限被授予", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

结尾

通过本文的介绍,我们深入了解了如何在 Android 应用中申请权限弹框,并通过代码示例逐步展示了实现过程。掌握这些基本知识后,开发者可以在应用中安全地使用敏感权限,提高用户体验并保护用户隐私。在实际开发中,时刻关注用户权限的管理与请求,为用户提供透明、可靠的使用体验,才是一个优秀开发者应保持的原则。