最近在学习内容提供者获取手机中的图片这个案例。但是发现运行的时候,加载不出来图片。无论是用虚拟机还是用真机都加载不出来图片
MainActivity:这里对运行时权限进行处理
package com.tianze.imagepicker;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
@RequiresApi(api = Build.VERSION_CODES.M)
public class MainActivity extends AppCompatActivity {
    public static final int PERMISSION_RESULT_CODE = 123;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkPermission();
    }
    private void checkPermission() {
        int readPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
        int writePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (readPermission != PackageManager.PERMISSION_GRANTED && writePermission != PackageManager.PERMISSION_GRANTED) {
            //请求权限
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_RESULT_CODE);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_RESULT_CODE) {
            if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                //表示有权限
                Toast.makeText(MainActivity.this, "授权成功!", Toast.LENGTH_SHORT).show();
            } else {
                //没有权限
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                        && !ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    //要是用户勾选了不在提示,就不再弹出提示
                } else {
                    //提示用户去授权
                    Toast.makeText(MainActivity.this, "请到“设置”-->“应用权限”中允许软件读取存储卡权限!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    public void imagePicker(View view) {
        //跳转到pickerActivity
        PickerActivity.start(MainActivity.this);
    }
}
PickerActivity
package com.tianze.imagepicker;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tianze.imagepicker.adapter.PicsListAdapter;
import com.tianze.imagepicker.beans.PicInfo;
import java.util.ArrayList;
import java.util.List;
public class PickerActivity extends AppCompatActivity {
    private static final String TAG = "PickerActivity";
    PicsListAdapter adapter;
    List<PicInfo> picInfosList = new ArrayList<>();
    public static final int LOADER_ID = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_picker);
        initData();
        initView();
    }
    private void initView() {
        RecyclerView picListUnselected = PickerActivity.this.findViewById(R.id.pic_list_unselect);
        picListUnselected.setLayoutManager(new GridLayoutManager(PickerActivity.this,3));
        adapter = new PicsListAdapter();
        picListUnselected.setAdapter(adapter);
    }
    private void initData() {
        final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        final String projection [] = new String[]{
                MediaStore.Images.Media.DATE_ADDED,
                MediaStore.Images.Media.DATA,
                MediaStore.Images.Media.DISPLAY_NAME
        };
        LoaderManager loaderManager = LoaderManager.getInstance(this);
        loaderManager.initLoader(LOADER_ID, null, new LoaderManager.LoaderCallbacks<Cursor>() {
            @NonNull
            @Override
            public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
                if (id == LOADER_ID){
                    return new CursorLoader(PickerActivity.this,uri,projection,null,null,projection[0]+" DESC");
                }
                return null;
            }
            @Override
            public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
                if (cursor != null || cursor.getCount() > 0) {
                    while (cursor.moveToNext()) {
                        PicInfo picInfo = new PicInfo();
                        picInfo.setCreateDate(cursor.getLong(0));
                        picInfo.setPath(cursor.getString(1));
                        picInfo.setName(cursor.getString(2));
                        picInfosList.add(picInfo);
                    }
                    for (PicInfo picInfo : picInfosList) {
                        Log.e(TAG, "onLoadFinished: 获取到的图片信息 === 》"+picInfo.toString() );
                    }
                    cursor.close();
                }
                adapter.setData(picInfosList);
            }
            @Override
            public void onLoaderReset(@NonNull Loader<Cursor> loader) {
            }
        });
    }
    public static void start(Context context) {
        Intent starter = new Intent(context, PickerActivity.class);
        context.startActivity(starter);
    }
}
PicsListAdapter 适配器
package com.tianze.imagepicker.adapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.tianze.imagepicker.R;
import com.tianze.imagepicker.beans.PicInfo;
import java.util.ArrayList;
import java.util.List;
public class PicsListAdapter extends RecyclerView.Adapter<PicsListAdapter.innerViewHolder> {
    List<PicInfo> picInfos = new ArrayList<>();
    private static final String TAG = "PicsListAdapter";
    @NonNull
    @Override
    public innerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.pics_list_item,parent,false);
        return new innerViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull innerViewHolder holder, int position) {
        Log.e(TAG, "onBindViewHolder: 绑定图片中的路径"+picInfos.get(position).getPath() );
        Log.e(TAG, "onBindViewHolder: 绑定图片中的名称"+picInfos.get(position).getName() );
        Log.e(TAG, "onBindViewHolder: 绑定图片中的创建日期"+picInfos.get(position).getCreateDate() );
        Glide.with(holder.imageView.getContext()).load(picInfos.get(position).getPath()).into(holder.imageView);
    }
    @Override
    public int getItemCount() {
        return picInfos.size();
    }
    public void setData(List<PicInfo> picInfosList) {
        picInfos.clear();
        picInfos.addAll(picInfosList);
        notifyDataSetChanged();
    }
    public class innerViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        public innerViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.image_iv);
        }
    }
}
模拟器或真机上显示权限不足,无法访问:

下面是我获取到的图片的信息

各路大侠看看是什么原因呗!
Android10.0的锅,我也遇到了,目前知道的是读取应用自身的文件不需要权限,比如: