Java 每次拒绝时,运行时权限都会返回
我对录音许可有异议 简而言之:-音频录制权限返回值始终为false 当用户启动应用程序时(第一次),它会显示权限请求 消息对话框 如果用户接受,则拒绝,一切正常。 下次当用户打开应用程序时,我检查是否授予了权限,它返回“权限被拒绝”,我再次请求权限。 每次启动麦克风录音时。它返回权限被拒绝,我必须再次请求权限。所以每次我启动麦克风,它都会返回拒绝许可。 我的问题是,应用程序应该在后台工作,并从一个小部件开始录制,但启动权限请求会将活动带到前面Java 每次拒绝时,运行时权限都会返回,java,android,android-permissions,android-audiorecord,Java,Android,Android Permissions,Android Audiorecord,我对录音许可有异议 简而言之:-音频录制权限返回值始终为false 当用户启动应用程序时(第一次),它会显示权限请求 消息对话框 如果用户接受,则拒绝,一切正常。 下次当用户打开应用程序时,我检查是否授予了权限,它返回“权限被拒绝”,我再次请求权限。 每次启动麦克风录音时。它返回权限被拒绝,我必须再次请求权限。所以每次我启动麦克风,它都会返回拒绝许可。 我的问题是,应用程序应该在后台工作,并从一个小部件开始录制,但启动权限请求会将活动带到前面 int permissionResult = Per
int permissionResult = PermissionChecker.checkSelfPermission(getApplicationContext(), Manifest.permission.RECORD_AUDIO);
// Start listening to voices
if (permissionResult == PermissionChecker.PERMISSION_DENIED || permissionResult == PermissionChecker.PERMISSION_DENIED_APP_OP) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions( new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION);
}
} else if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.RECORD_AUDIO)) {
showPermissionMessageDialog();
} else if (permissionResult == PermissionChecker.PERMISSION_GRANTED) {
//granted.
}
private void showPermissionMessageDialog() {
MessageDialogFragment
.newInstance(getString(R.string.permission_message))
.show(getSupportFragmentManager(), FRAGMENT_MESSAGE_DIALOG);
}
MessageDialogFragment
/**
* A simple dialog with a message.
*
* <p>The calling {@link android.app.Activity} needs to implement {@link
* MessageDialogFragment.Listener}.</p>
*/
public class MessageDialogFragment extends AppCompatDialogFragment {
public interface Listener {
/**
* Called when the dialog is dismissed.
*/
void onMessageDialogDismissed();
}
private static final String ARG_MESSAGE = "message";
/**
* Creates a new instance of {@link MessageDialogFragment}.
*
* @param message The message to be shown on the dialog.
* @return A newly created dialog fragment.
*/
public static MessageDialogFragment newInstance(String message) {
final MessageDialogFragment fragment = new MessageDialogFragment();
final Bundle args = new Bundle();
args.putString(ARG_MESSAGE, message);
fragment.setArguments(args);
return fragment;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext())
.setMessage(getArguments().getString(ARG_MESSAGE))
.setPositiveButton(android.R.string.ok, (dialog, which) -> ((Listener) getActivity()).onMessageDialogDismissed())
.setOnDismissListener(dialogInterface -> ((Listener) getActivity()).onMessageDialogDismissed())
.create();
}
}
/**
*带有消息的简单对话框。
*
*调用{@link android.app.Activity}需要实现{@link
*MessageDialogFragment.Listener}
*/
公共类MessageDialogFragment扩展了AppCompatDialogFragment{
公共接口侦听器{
/**
*当对话框被取消时调用。
*/
void onMessageDialogDisposed();
}
私有静态最终字符串ARG_MESSAGE=“MESSAGE”;
/**
*创建{@link MessageDialogFragment}的新实例。
*
*@param message要在对话框上显示的消息。
*@返回一个新创建的对话框片段。
*/
publicstaticmessagedialogfragmentnewinstance(字符串消息){
final MessageDialogFragment fragment=新MessageDialogFragment();
最终Bundle args=新Bundle();
args.putString(ARG_消息,消息);
fragment.setArguments(args);
返回片段;
}
@非空
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
返回新的AlertDialog.Builder(getContext())
.setMessage(getArguments().getString(ARG_消息))
.setPositiveButton(android.R.string.ok,(dialog,which)->((侦听器)getActivity()).onMessageDialogDisposed())
.setOnDismissListener(dialogInterface->((Listener)getActivity()).OnMessageDialogDisposed())
.create();
}
}
显示
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="....">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
showPermissionMessageDialog()看起来像什么?@LarrySchiefer更新了帖子,还得到了一个带有库的解决方案。如果我能知道为什么我的方法不起作用,这样我就能了解我的错误,那就更好了。很难说没有看到更多的代码以及PermissionChecker
在做什么。如果您有兴趣使用一个库来简化此过程,请查看andele: