Разрешения Android M закрывают мое приложение

Я проверяю необходимые разрешения на экране входа в систему. Откроется диалоговое окно с запросом 4 необходимых мне разрешений. Все хорошо, но когда появляется диалоговое окно, фон становится черным, и мое приложение закрывается (не падает, просто закрывается). Когда я закончу с выбором разрешений, я снова открываю приложение, и оно продолжает работать с того места, где оно остановилось. Как я могу заставить приложение продолжать работать, пока отображается диалог разрешений? Я использую класс, который проверяет наличие разрешений и вызываю его в действии «Вход в систему».

Класс:

public abstract class RuntimePermissionsActivity extends AppCompatActivity {
private SparseIntArray mErrorString;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mErrorString = new SparseIntArray();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    for (int permission : grantResults){
        permissionCheck = permissionCheck + permission;
    }
    if ((grantResults.length>0) && permissionCheck == PackageManager.PERMISSION_GRANTED){
        onPermissionsGranted(requestCode);
    }
    else {

                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:" + getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                startActivity(intent);
    }
}

public void requestAppPermissions(final String[] requestedPermissions, final int requestCode){
    int stringId = 0;
    mErrorString.put(requestCode, stringId);
    int permissionCheck = PackageManager.PERMISSION_GRANTED;
    boolean shouldShowRequestPermissionRationale = false;
    for (String permission : requestedPermissions){
        permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);
        shouldShowRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permission);
    }
    if(permissionCheck != PackageManager.PERMISSION_GRANTED){
        if(shouldShowRequestPermissionRationale){
                    ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode);
        }
        else {
            ActivityCompat.requestPermissions(this, requestedPermissions, requestCode);
            Toast.makeText(RuntimePermissionsActivity.this, "Please relaunch the application in order for the changes to take effect!", Toast.LENGTH_LONG).show();
        }
    }
    else {
        onPermissionsGranted(requestCode);
    }

}
public abstract void onPermissionsGranted(int requestCode);
}

Журнал активности входа в систему:

LoginActivity.super.requestAppPermissions(new
            String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS);
 Mohammed Atif09 авг. 2016 г., 09:53
Не могу понять, что вы на самом деле делаете
 IntelliJ Amiya09 авг. 2016 г., 10:03
@ N.Park проверь мой ответstackoverflow.com/a/33163206/3395198
 N. Park09 авг. 2016 г., 11:33
@MohammedAtif Как вы думаете, какую точку зрения я должен надувать?
 N. Park09 авг. 2016 г., 10:00
@MohammedAtif Проверка, предоставляются ли разрешения во время выполнения, потому что после Android M разрешения предоставляются не во время установки, а после запуска приложения.
 Mohammed Atif09 авг. 2016 г., 10:35
Я полностью понимаю разрешения времени выполнения и реализовал его несколько раз. Но я не понимаю использование отдельной деятельности, чтобы спросить разрешения. И очень плохое использование обоснования запроса.
 IntelliJ Amiya09 авг. 2016 г., 10:35
@ Вы должны добавить оба разрешения
 Mohammed Atif09 авг. 2016 г., 12:19
Вы должны избегать использования отдельного класса для запроса разрешений. Спросите разрешения только тогда, когда это необходимо в той же деятельности.
 N. Park09 авг. 2016 г., 10:33
@IntelliJAmiya Спасибо. Я попробовал ваш ответ, но экран по-прежнему потемнел, на этот раз показывая только один диалог для первого разрешения.
 Mohammed Atif09 авг. 2016 г., 10:38
Вы даже не надуваете какое-либо представление или не добавляете надлежащие действия к этому специальному разрешению, запрашивающему действие. Вот почему вы получаете пустой экран и приложение закрывается. Попробуйте реализовать разрешения в самой функции loginActivity вместо создания дополнительных классов.

Ответы на вопрос(5)

Напишите всего несколько строк кодов:

 final int requestCode=100;
 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ) {
     String[] per = {Manifest.permission.READ_CONTACTS};
     requestPermissions(per, requestCode);

     if (ActivityCompat.checkSelfPermission(CollectZone.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
         // recall permission until is not permitted
     } else { 
         // write execution code here   
     }
 }

Я столкнулся с той же проблемой, проверьте, если активностьandroid:noHistory="true" в вашем файле манифеста.

 Panther15 дек. 2016 г., 09:02
Пожалуйста, elobrate немного

Удаление атрибута android: noHistory = "true" из соответствующего тега RuntimePermissionsActivity из файла манифеста Android решило эту проблему.

Решение Вопроса

Пример реализации Разрешения в любой Деятельности.

SampleActivity.java

public class SampleActivity extends AppCompatActivity{
    private final int PERMISSION_CODE = 1;
    Button button;
    @override
    onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        setContentView(R.layout.your_layout);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener(){
            @override
            public void onClick(View view){
                requestPermissionAndContinue();
            }
        });
        //remaining code to continue using the app
        //your actual code should also be in this same class
    }

    private void requestPermissionAndContinue(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){
                Log.e(TAG, "permission denied, show dialog");
            }else{
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, PERMISSION_CODE);
            }
        }else{
            accessContacts();
        }
    }

    private void accessContacts(){
        //your code once you receive permission
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(grantResults.length > 0 && permissions[0]==PackageManager.PERMISSION_GRANTED){
            accessContacts();
        }else{
             //redirect to settings page or ask permission again
        }
    }
}
 IntelliJ Amiya09 авг. 2016 г., 13:01
да да. я так думаю

Та же проблема здесь.

Ankit Jain был на трассе. Удалениеandroid:noHistory="true" исправилN.Park проблема.

Хотя в моем случае мне нужно, чтобы это значение было истинным, или, по крайней мере, такое поведение (у меня был SplashScreen, где я управлял разрешениями, и после перехода я захотел, чтобы эта активность была удалена из моего стека).

Так:

Я удалил строкуandroid:noHistory="true"

В своей деятельности управляю разрешением без проблем

После этого я перехожу к следующему упражнению с:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
 Denis22 нояб. 2017 г., 18:01
Удаление андроида: noHistory = "true" решило проблему

Ваш ответ на вопрос