因此,我尝试使用新的 registerForActivityResult() 方法获得许可,并使用 .launch() 按钮单击请求,但它似乎没有打开任何窗口来请求它。我总是在 registerForActivityResult() 中出错。
// Permission to get photo from gallery, gets permission and produce boolean
private ActivityResultLauncher<String> mPermissionResult = registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
new ActivityResultCallback<Boolean>() {
@Override
public void onActivityResult(Boolean result) {
if(result) {
Log.e(TAG, "onActivityResult: PERMISSION GRANTED");
} else {
Log.e(TAG, "onActivityResult: PERMISSION DENIED");
}
}
});
// Launch the permission window -- this is in onCreateView()
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPermissionResult.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的日志:onActivityResult: PERMISSION DENIED
SO 上已经有很多关于这个主题的问题(一、二、三、四)。然而,到目前为止我找到的答案都不能解决我的问题。
问题是ActivityCompat.requestPermissions不会触发弹出窗口,要求用户授予通知权限。
设置:
<uses-permission android:name="android.permission.POST_NOTIFICATION" />if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_DENIED)
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, 1);
}
Run Code Online (Sandbox Code Playgroud)
回调如下:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainScreenActivity.this, "Woho, you have enabled notifications!", Toast.LENGTH_SHORT).show(); …Run Code Online (Sandbox Code Playgroud) 即使我已经在清单中声明了使用权限,它也会给我一个错误,说我需要添加权限.
android清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="groep2.project4">
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission-sdk-23 android:name="android.permission.READ_CALENDAR"/>
<uses-permission-sdk-23 android:name="android.permission.WRITE_CALENDAR"/>
Run Code Online (Sandbox Code Playgroud)
错误:
FATAL EXCEPTION: main
Process: groep2.project4, PID: 3188
java.lang.SecurityException: Permission Denial:
opening provider com.android.providers.calendar.CalendarProvider2
from ProcessRecord{81d3d48 3188:groep2.project4/u0a58} (pid=3188, uid=10058)
requires android.permission.READ_CALENDAR or android.permission.WRITE_CALENDAR
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3550)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4778)
at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1999)
at android.content.ContentResolver.acquireProvider(ContentResolver.java:1421)
at android.content.ContentResolver.insert(ContentResolver.java:1225)
at groep2.project4.Fragments.pushAppointmentsToCalendar.pushAppointmentsToCalender(pushAppointmentsToCalendar.java:50)
at groep2.project4.Fragments.TimePickerFragment.makeReminder(TimePickerFragment.java:46)
at groep2.project4.Fragments.TimePickerFragment.onTimeSet(TimePickerFragment.java:41)
at android.app.TimePickerDialog.onClick(TimePickerDialog.java:145)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)
这是pushappointmentstocalendar.java
package groep2.project4.Fragments;
import …Run Code Online (Sandbox Code Playgroud) 这是我当前(已弃用)的方法:
int LOCATION_REQUEST_CODE = 10001;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == LOCATION_REQUEST_CODE) {
//Permission granted
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
checkSettingsAndStartLocationUpdates();
} else {
//DO SOMETHING - Permission not granted
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据android文档https://developer.android.com/training/basics/intents/result我应该使用registerForActivityResult():
// GetContent creates an ActivityResultLauncher<String> to allow you to pass
// in the mime type you'd like to allow the user to select
ActivityResultLauncher<String> mGetContent = registerForActivityResult(new GetContent(),
new ActivityResultCallback<Uri>() { …Run Code Online (Sandbox Code Playgroud)