【问题标题】:Permissions in android 6.xandroid 6.x 中的权限
【发布时间】:2018-06-13 11:13:40
【问题描述】:

我有一个应用程序,有一个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

【问题讨论】:

  • 你检查过我对这个SO的回答了吗?

标签: java android permissions android-viewpager runtime-permissions


【解决方案1】:

首先,让我们尝试看看您遇到问题的根源:

第一次无法正常工作,因为您正在异步执行某些操作并期望同步获得结果:

requestRead();
checkPermission();

所以,当你调用 checkPermission();尚未授予权限。

可能的解决方案是:

在你的activity或fragment中处理权限请求:link1link2,这是你应该熟悉的官方documentation,因为你已经实现了这个功能。然后,当权限被授予时

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

您可以让适配器知道(adapter.readPermissionGranted() 仅作为示例),以便它可以获取图像(getAllShownImagesPath();)。

【讨论】:

  • 所以我不需要在适配器中做任何事情?只在活动中?
  • 如果 pagerAdapter 在片段中,我建议您检查片段中的权限,否则在 Activity 中进行。然后,正如我在回答中所写,让适配器知道它具有读取权限。
  • 其实你可以在Activity或Fragment中移动所有获取图片路径的逻辑,并将String列表作为参数传递给PagerAdapter。但是这取决于你,没有什么可做的使用权限:)
  • 我有片段。我在片段内完成了权限检查,我想让适配器知道我需要调用 adapter.getAllShownImagesPath(); ?
  • 您可以在通过“onRequestPermissionsResult”确定您有权限或检查权限后进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2022-11-19
  • 2016-03-16
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多