Java 从Android gallery加载位图图像时出现FileNotFound异常
我正在尝试从我的Android gallery创建位图图像。 我在AsyncTask中这样做,这就是为什么我在实现中有一个游标的原因。代码如下Java 从Android gallery加载位图图像时出现FileNotFound异常,java,android,bitmap,android-asynctask,filenotfoundexception,Java,Android,Bitmap,Android Asynctask,Filenotfoundexception,我正在尝试从我的Android gallery创建位图图像。 我在AsyncTask中这样做,这就是为什么我在实现中有一个游标的原因。代码如下 try { uri = Uri.parse(uriStr); } catch (Exception e) { Log.e(LOG_TAG, "problem with the image loading: " + e);
try {
uri = Uri.parse(uriStr);
} catch (Exception e) {
Log.e(LOG_TAG, "problem with the image loading: " + e);
}
if(uri == null)
continue;
Bitmap bm = null;
try{
bm = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);
} catch (FileNotFoundException e) {
Log.e(LOG_TAG, "Bitmap not found: " + e);
} catch (IOException e) {
Log.e(LOG_TAG, "Bitmap IO error: " + e);
调试时,我注意到抛出了一个FileNotFoundException,
输出:
08-17 13:47:55.754 30333-30668/com.example.jonas.shoppinglist
W/System.err﹕ java.io.FileNotFoundException:无内容提供程序:
/存储/模拟/0/下载/未命名.jpg 08-17 13:47:55.833
30333-30668/com.example.jonas.shoppinglist W/System.err﹕ 在
openTypedAssetFileDescriptor(ContentResolver.java:1086)
08-17 13:47:55.921 30333-30668/com.example.jonas.shoppinglist
W/System.err﹕ 在
openAssetFileDescriptor(ContentResolver.java:941)
08-17 13:47:55.975 30333-30668/com.example.jonas.shoppinglist
W/System.err﹕ 在
openInputStream(ContentResolver.java:666)
08-17 13:47:56.019 30333-30668/com.example.jonas.shoppinglist
W/System.err﹕ 在
MediaStore$Images$Media.getBitmap(MediaStore.java:849)
08-17 13:47:56.062 30333-30668/com.example.jonas.shoppinglist
W/System.err﹕ 在
com.example.jonas.shoppinglist.processs.ShoppingGallery.doInBackground(ShoppingGallery.java:51)
结果是我没有得到我的图库的一张位图图像。问题出在哪里?您可以尝试下面的代码,从gallery获得正确的图像路径。。。。。
you can try below code for achiving proper image path from gallery .....
public void pickImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 1000);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1000 && resultCode == Activity.RESULT_OK) {
if (data == null) {
// Display an error
return;
}
if (Build.VERSION.SDK_INT < 11)
ImagePath = RealPathUtil.getRealPathFromURI_BelowAPI11(this,
data.getData());
// SDK >= 11 && SDK < 19
else if (Build.VERSION.SDK_INT < 19)
ImagePath = RealPathUtil.getRealPathFromURI_API11to18(this,
data.getData());
// SDK > 19 (Android 4.4)
else
ImagePath = RealPathUtil.getRealPathFromURI_API19(this,
data.getData());
}
}
-----------------------------------
//class
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
public class RealPathUtil {
@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri){
String filePath = "";
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Images.Media.DATA };
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{ id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
@SuppressLint("NewApi")
public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
String result = null;
CursorLoader cursorLoader = new CursorLoader(
context,
contentUri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if(cursor != null){
int column_index =
cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
result = cursor.getString(column_index);
}
return result;
}
public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index
= cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
公共图像(){
意向意向=新意向(意向.行动\u获取\u内容);
intent.setType(“image/*”);
startActivityForResult(意向,1000);
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==1000&&resultCode==Activity.RESULT\u确定){
如果(数据==null){
//显示错误
返回;
}
if(Build.VERSION.SDK_INT<11)
ImagePath=RealPathUtil.getRealPathFromURI_BelowAPI11(这个,
data.getData());
//SDK>=11&&SDK<19
else if(Build.VERSION.SDK_INT<19)
ImagePath=RealPathUtil.getRealPathFromURI_API11to18(这个,
data.getData());
//SDK>19(安卓4.4)
其他的
ImagePath=RealPathUtil.getRealPathFromURI_API19(此,
data.getData());
}
}
-----------------------------------
//阶级
导入android.annotation.SuppressLint;
导入android.content.Context;
导入android.content.CursorLoader;
导入android.database.Cursor;
导入android.net.Uri;
导入android.provider.documents合同;
导入android.provider.MediaStore;
公共类RealPathUtil{
@SuppressLint(“新API”)
公共静态字符串getRealPathFromURI_API19(上下文,Uri){
字符串filePath=“”;
字符串wholeID=DocumentsContract.getDocumentId(uri);
//在冒号处拆分,使用数组中的第二项
字符串id=wholeID.split(“:”[1];
字符串[]列={MediaStore.Images.Media.DATA};
//其中id等于
字符串sel=MediaStore.Images.Media._ID+“=?”;
Cursor Cursor=context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI,
列,sel,新字符串[]{id},null);
int columnIndex=cursor.getColumnIndex(列[0]);
if(cursor.moveToFirst()){
filePath=cursor.getString(columnIndex);
}
cursor.close();
返回文件路径;
}
@SuppressLint(“新API”)
公共静态字符串getRealPathFromURI_API11to18(上下文上下文,Uri contentUri){
字符串[]proj={MediaStore.Images.Media.DATA};
字符串结果=null;
游标装入器游标装入器=新游标装入器(
上下文
contentUri,proj,null,null,null);
Cursor Cursor=cursorLoader.loadInBackground();
如果(光标!=null){
int列_索引=
cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
结果=cursor.getString(列索引);
}
返回结果;
}
公共静态字符串getRealPathFromURI_BelowAPI11(上下文,Uri contentUri){
字符串[]proj={MediaStore.Images.Media.DATA};
Cursor Cursor=context.getContentResolver().query(contentUri,proj,null,null);
int列索引
=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
返回cursor.getString(列索引);
}
}
您可以尝试下面的代码,从gallery获得正确的图像路径。。。。。
公共图像(){
意向意向=新意向(意向.行动\u获取\u内容);
intent.setType(“image/*”);
startActivityForResult(意向,1000);
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==1000&&resultCode==Activity.RESULT\u确定){
如果(数据==null){
//显示错误
返回;
}
if(Build.VERSION.SDK_INT<11)
ImagePath=RealPathUtil.getRealPathFromURI_