Каждый раз, когда я запускаю приложение в первый раз, оно падает, а затем запрашивает у меня разрешение пользователя. - PullRequest
0 голосов
/ 22 января 2019

Мое приложение Android аварийно завершает работу при первом запуске и запрашивает разрешение пользователя на вызов. Когда я снова запускаю приложение, оно работает нормально. Я пробовал следующий код.

public void loadContactList() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {.....}
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            loadContactList();
        } else {
            Toast.makeText(this, "Until you grant the permission, we canot display the list", Toast.LENGTH_SHORT).show();
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Ваш код верен, но вы установили коды в неправильных местах, попробуйте это, это определенно поможет вам ....

In Your Main Activity...

private int STORAGE_PERMISSION_CODE = 1;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == 
  PackageManager.PERMISSION_GRANTED) {
        filter();
        Toast.makeText(this, ""+arrayList, Toast.LENGTH_SHORT).show();
    } else {
        Permission.requestStoragePermission(MainActivity.this,
                  STORAGE_PERMISSION_CODE);
    }

}//on create closed

Метод разрешения .....

//---------------------------------RuntimePermission-----------------------------//
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
    permissions, @NonNull int[] grantResults) {
    if (requestCode == STORAGE_PERMISSION_CODE)  {
        if (grantResults.length > 0 && grantResults[0] == 
     PackageManager.PERMISSION_GRANTED) {
            filter();
        } else {
            Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();

Permission.requestStoragePermission(MainActivity.this,STORAGE_PERMISSION_CODE);
        }
    }
}

после этого создайте Java-класс для получения разрешения ....

public class Permission {
public static void requestStoragePermission(final Activity activity, final int 
       STORAGE_PERMISSION_CODE) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        new AlertDialog.Builder(activity)
                .setTitle("Permission needed")
                .setMessage("This permission is needed because of this and that")
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(activity,
                                new String[] 
        {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
                    }
                })
                .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .create().show();
    } else {
        ActivityCompat.requestPermissions(activity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
   STORAGE_PERMISSION_CODE);
    }
}

}

Главное, что вы должны помнить, - это разместить свой рабочий метод в нужном месте, как мойфильтр();

Это будет работать для вас, потому что это работает для меня, когда я застрял в той же ситуации

0 голосов
/ 22 января 2019

Я только что решил исключение. Я сделал две вещи. Во-первых, я удалил инициализацию контактов с помощью
Contacts = new ArrayList<ContactModel> из loadContactList() и добавил его в onCreate(), а во-вторых, я просто изменил тип возвращаемых данных loadContactList() с void на список. Затем я вернул контакты в loadContacts (), чтобы loadListView() мог получить этот список и отобразить его в виде списка.

0 голосов
/ 22 января 2019

Добавьте следующий код

String[] appPermissions =
            {Manifest.permission.READ_CONTACTS,
                    Manifest.permission.WRITE_CONTACTS};
    int PERMISSIONS_REQUEST_CODE = 234;

Вызовите этот метод из вашего при создании

checkAndRequestPermissions();

Добавьте следующий метод к вашей основной деятельности

public boolean checkAndRequestPermissions() {
        List<String> listPermissionsNeeded = new ArrayList<>();
        for (String perm : appPermissions) {
            if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(perm);
            }
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSIONS_REQUEST_CODE);
            return false;
        }
        return true;
    }
...