Android 从图库中选择图像不起作用(Android 6.0 和 Android 5.1.1)
Android pick image from gallery not working (Android 6.0 & Android 5.1.1)
我正在使用下面的代码从设备库中选择一个图像文件:
首先我调用这段代码:
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(i, "Select Picture"), RESULT_LOAD_IMAGE);
这是我的onActivityResult
方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
photoPath = getPath(data.getData());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis;
try {
fis = new FileInputStream(new File(photoPath));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf))) {
baos.write(buf, 0, n);
}
img.setImageBitmap(BitmapFactory.decodeFile(photoPath));
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是一个检索图像路径的辅助方法:
private String getPath(Uri uri) {
String[] data = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(getApplicationContext(), uri, data, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
我的问题是应用程序很奇怪。在我的 6.0 模拟器中,有时有效,有时无效。在其他设备 (Android 5.1.1) 中,在这一行
抛出一个 FileNotFound Exception
fis = new FileInputStream(new File(photoPath));
所有必需的权限都是 fine.Do 你们知道这里发生了什么吗?或者您有什么更好的建议可以用来从图库中挑选图像吗?
第 1 步:删除 ByteArrayOutputStream
,因为您没有使用它。
步骤 #2:删除 photoPath = getPath(data.getData());
和 getPath()
方法,因为它们是错误的。
第 3 步:使用 an image loading library 异步填充您的 ImageView
,将其传递给要加载的图像的 Uri
(data.getData()
)。或者,滚动大量您自己的图像加载代码,包括分叉后台线程并使用 getContentResolver().openInputStream()
在 Uri
.
标识的内容上获取 InputStream
你可以像下面的代码一样使用
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
if (data == null) {
//Display an error
return;
}
InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
//Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
}
}
试试这个你可以直接从onActivityResult设置图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
try{
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//你在片段中所以使用下面的代码希望它的工作
最终 Uri imageUri = data.getData();
final InputStream imageStream =getActivity().getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
我正在使用下面的代码从设备库中选择一个图像文件:
首先我调用这段代码:
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(i, "Select Picture"), RESULT_LOAD_IMAGE);
这是我的onActivityResult
方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
photoPath = getPath(data.getData());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis;
try {
fis = new FileInputStream(new File(photoPath));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf))) {
baos.write(buf, 0, n);
}
img.setImageBitmap(BitmapFactory.decodeFile(photoPath));
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是一个检索图像路径的辅助方法:
private String getPath(Uri uri) {
String[] data = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(getApplicationContext(), uri, data, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
我的问题是应用程序很奇怪。在我的 6.0 模拟器中,有时有效,有时无效。在其他设备 (Android 5.1.1) 中,在这一行
抛出一个FileNotFound Exception
fis = new FileInputStream(new File(photoPath));
所有必需的权限都是 fine.Do 你们知道这里发生了什么吗?或者您有什么更好的建议可以用来从图库中挑选图像吗?
第 1 步:删除 ByteArrayOutputStream
,因为您没有使用它。
步骤 #2:删除 photoPath = getPath(data.getData());
和 getPath()
方法,因为它们是错误的。
第 3 步:使用 an image loading library 异步填充您的 ImageView
,将其传递给要加载的图像的 Uri
(data.getData()
)。或者,滚动大量您自己的图像加载代码,包括分叉后台线程并使用 getContentResolver().openInputStream()
在 Uri
.
InputStream
你可以像下面的代码一样使用
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
if (data == null) {
//Display an error
return;
}
InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
//Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
}
}
试试这个你可以直接从onActivityResult设置图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
try{
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//你在片段中所以使用下面的代码希望它的工作 最终 Uri imageUri = data.getData();
final InputStream imageStream =getActivity().getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);