安卓弹出申请访问权限

在安卓工程的 AndroidManifest 文件中添加了权限,但是 app 打开时,并没有弹出申请访问相关权限的弹窗,请问下论坛大佬们,这个要怎么解决,卡好几天了 :joy:

在 Android 中,即使在 AndroidManifest.xml 文件中声明了权限,运行时仍需要请求某些危险权限(例如位置、摄像头、存储等)的授权。这是因为从 Android 6.0 (API level 23) 开始,引入了运行时权限模型,用户在安装应用时不再被要求授权危险权限,而是在应用运行时请求这些权限。

步骤

1.	在 AndroidManifest.xml 中声明权限

确保在 AndroidManifest.xml 文件中声明了所需的权限。例如:

2.	在应用运行时请求权限

在应用运行时请求权限。可以在 Activity 或 Fragment 中进行此操作。以下是一个示例:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

private static final int REQUEST_PERMISSIONS_CODE = 123;

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

    // 检查权限是否已被授予
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        
        // 如果没有授予权限,请求权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_PERMISSIONS_CODE);
    } else {
        // 权限已被授予,继续进行相关操作
        startCameraAndLocation();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
            // 权限被授予,继续进行相关操作
            startCameraAndLocation();
        } else {
            // 权限被拒绝,处理拒绝的情况
        }
    }
}

private void startCameraAndLocation() {
    // 执行需要权限的操作
}

}

解释

1.	检查权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

1.	使用 ContextCompat.checkSelfPermission 检查权限是否已被授予。如果未授予权限,则请求权限。
2.	请求权限:

ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_PERMISSIONS_CODE);

2.	使用 ActivityCompat.requestPermissions 请求权限,并传递所需的权限列表和请求代码。
3.	处理权限请求结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSIONS_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
startCameraAndLocation();
} else {
// 权限被拒绝,处理拒绝的情况
}
}
}

3.	在 onRequestPermissionsResult 回调中处理权限请求结果。如果权限被授予,则继续执行需要权限的操作。

通过以上步骤,您可以确保在运行时请求所需的权限,并处理用户的授权结果。这将确保您的应用在需要危险权限时弹出请求权限的对话框。

1赞

GPT大抵是会这些的

谢谢大佬,我回头试试, :100: