Разрешения в Android 6.x - PullRequest
0 голосов
/ 13 июня 2018

У меня есть приложение, есть viewPager, куда я добавляю свои фотографии из галереи.

В старых версиях, которые работали здорово, но начиная с Android 6.0 и выше, мне нужно спрашивать разрешения во время выполнения.Я сделал этоНо проблема в том, что когда я разрешаю разрешения, изображение не загружается в viewPager и после второго раза оно загружается нормально.

viewPager адаптер (я загружаюизображения из галереи)

public class ImageAdapter extends PagerAdapter {

private ImageView imageView;
private Context context;
private LayoutInflater inflater;
public ArrayList<String> listOfAllImages = new ArrayList<>();
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;

public ImageAdapter(Context context) {
    this.context = context;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestRead();
        checkPermission();
    } else {
        getAllShownImagesPath();
    }
}

private void requestRead() {
    if (ContextCompat.checkSelfPermission(context,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions((Activity) context,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
    } else {
        getAllShownImagesPath();
    }
}

private void checkPermission(){
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        getAllShownImagesPath();
    }
}

@Override
public int getCount() {
    return listOfAllImages.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.photopager, null);
    imageView = (ImageView) view.findViewById(R.id.photoView2);

    Glide.with(context).load(listOfAllImages.get(position))
            .thumbnail(1f)
            .crossFade()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(imageView);

    ViewPager viewPager = (ViewPager) container;
    viewPager.addView(view, 0);
    return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ViewPager vp = (ViewPager) container;
    View view = (View) object;
    vp.removeView(view);
}

private void getAllShownImagesPath() {
    Uri uri;
    Cursor cursor;
    int column_index_data;
    String absolutePathOfImage;
    uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    String[] projection = {MediaStore.MediaColumns.DATA,
            MediaStore.Images.Media.BUCKET_DISPLAY_NAME};

    cursor = context.getContentResolver().query(uri, projection, null,
            null, null);

    column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
    while (cursor.moveToNext()) {
        absolutePathOfImage = cursor.getString(column_index_data);
        listOfAllImages.add(absolutePathOfImage);
    }

    cursor.close();
}
}

Как загрузить изображения после нажатия allow в запросе на разрешение?

Это адаптер, потому что я не могу переопределить onRequestPermissionsResult.

1 Ответ

0 голосов
/ 13 июня 2018

Во-первых, давайте попробуем увидеть источник проблемы, с которой вы столкнулись:

она не работает в первый раз, потому что вы выполняете что-то асинхронно и ожидаете получить результаты синхронно:

requestRead();
checkPermission();

так, когда вы вызываете checkPermission ();разрешение еще не было предоставлено.

Возможное решение:

Обработка запроса на разрешение в вашей активности или фрагменте: link1 и link2 и это официальная документация , с которой вам следует ознакомиться, поскольку вы уже реализовали эту функцию ранее.Затем, когда разрешение предоставлено

onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults)

, вы можете сообщить об этом адаптеру (adapter.readPermissionGranted () в качестве примера), чтобы он мог извлекать изображения (getAllShownImagesPath ();).

...