У меня проблема с разрешением AUDIO_RECORD
Вкратце: - разрешение AUDIO_RECORD всегда возвращает false.
Когда пользователь запускает приложение (первый раз), он показывает запрос на разрешение
диалог сообщений
если пользователь принимает, отрицает, что все работает хорошо.
В следующий раз, когда пользователь открывает приложение, я проверяю, предоставлено ли разрешение, оно возвращает разрешение, отклоненное, и я снова запрашиваю разрешения.
И каждый раз при запуске микрофона записывать. Он возвращает отказано в разрешении, и я должен снова запросить разрешения. Так что каждый раз, когда я запускаю микрофон, он возвращает отказано в разрешении.
Моя проблема в том, что приложение должно работать в фоновом режиме и начинать запись, например, с виджета, но при запуске запроса на разрешение оно выводит активность вперед.
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();
}
}
Манифест
<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" />