在 Android 應用中監聽權限設置界面定位權限開啟,可以通過 ActivityResultLauncher 和 Intent 對象來實現。具體步驟如下:
在 AndroidManifest.xml 文件中添加定位權限聲明:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
創建一個 ActivityResultLauncher 對象,并實現 ActivityResultCallback 接口:
ActivityResultLauncher<Intent> permissionSettingLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
// 在權限設置界面返回后的回調函數中,檢查定位權限是否已被授予
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
// 定位權限已被授予
} else {
// 定位權限被拒絕
}
});
其中,permissionSettingLauncher 是自定義的 ActivityResultLauncher 對象,用于啟動權限設置界面并在界面返回后接收結果。
在應用中請求定位權限,可以使用如下代碼:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION_PERMISSION);
} else {
// 定位權限已被授予
}
其中,REQUEST_LOCATION_PERMISSION 是自定義的請求代碼,可以用來在權限請求回調函數中判斷請求的權限類型。
在定位權限被拒絕時,啟動權限設置界面:
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 用戶拒絕了定位權限,但是沒有勾選“不再詢問”,可以繼續請求權限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION_PERMISSION);
} else {
// 用戶拒絕了定位權限,并勾選了“不再詢問”,需要引導用戶去設置界面手動開啟權限
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
permissionSettingLauncher.launch(intent);
}
其中,shouldShowRequestPermissionRationale() 方法用于判斷用戶是否勾選了“不再詢問”,如果用戶沒有勾選,則繼續請求權限;否則,啟動權限設置界面。
在啟動權限設置界面后,如果用戶在設置界面開啟了定位權限,則在回調函數中接收到 RESULT_OK 狀態碼,否則接收到 RESULT_CANCELED 狀態碼。根據返回的狀態碼,可以判斷用戶是否已經開啟了定位權限:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
permissionSettingLauncher.launch(intent);
通過上述步驟,就可以在 Android 應用中監聽權限設置界面定位權限開啟,并在權限開啟后獲取用戶的位置信息。