最近在学习内容提供者获取手机中的图片这个案例。但是发现运行的时候,加载不出来图片。无论是用虚拟机还是用真机都加载不出来图片
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的锅,我也遇到了,目前知道的是读取应用自身的文件不需要权限,比如: