Разрешения времени выполнения возвращаются каждый раз, когда отказано - PullRequest
0 голосов
/ 04 июля 2018

У меня проблема с разрешением 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" />
...