Java 从Android gallery加载位图图像时出现FileNotFound异常

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);

我正在尝试从我的Android gallery创建位图图像。 我在AsyncTask中这样做,这就是为什么我在实现中有一个游标的原因。代码如下

                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_