Android getAbsolutePath(data.getData())始终返回null

时间:2015-07-06 11:50:30

标签: java android io uri

我正在尝试编写一个应用程序来显示用户所选图像的EXIF数据(学校结束了,我很无聊) 在寻找如何允许用户选择图像时,在线的一般共识似乎是,编写您自己的文件浏览器,或使用意图启动另一个可以查看文件的应用程序,并收集它返回的数据。

我找到了以下代码 - 这个公共类ListFileActivity扩展了ActionBarActivity {

private String selectedImagePath = "";
final private int PICK_IMAGE = 1;
final private int CAPTURE_IMAGE = 2;
ImageView imgView;
private String imgPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_file);

}

public void cameraClick(View view) {
    final Intent intent = new Intent(
            MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            setImageUri());
    startActivityForResult(intent, CAPTURE_IMAGE);
}
public void galleryClick(View view) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(
            Intent.createChooser(intent, ""),
            PICK_IMAGE);
}

public Uri setImageUri() {
    // Store image in dcim
    File file = new File(Environment.getExternalStorageDirectory()
            + "/DCIM/", "image" + new Date().getTime() + ".png");
    Uri imgUri = Uri.fromFile(file);
    this.imgPath = file.getAbsolutePath();
    return imgUri;
}

public String getImagePath() {
    return imgPath;
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data) {
    if (resultCode != Activity.RESULT_CANCELED) {
        if (requestCode == PICK_IMAGE) {
            selectedImagePath = getAbsolutePath(data.getData());
            String TAG = "Showing image";
            Log.v(TAG, "Showing the image with a path of " + selectedImagePath);
            //The path returns null, piece of crap

            //imgView.setImageBitmap(decodeFile(selectedImagePath));
        } else if (requestCode == CAPTURE_IMAGE) {
            selectedImagePath = getImagePath();
            imgView.setImageBitmap(decodeFile(selectedImagePath));
        } else {
            super.onActivityResult(requestCode, resultCode,
                    data);
        }
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is
    // present.
    getMenuInflater().inflate(R.menu.menu_main, menu); //Was originally R.menu.main
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public Bitmap decodeFile(String path) {
    try {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, o);
        // The new size we want to scale to
        final int REQUIRED_SIZE = 70;

        // Find the correct scale value. It should be the power of
        // 2.
        int scale = 1;
        while (o.outWidth / scale / 2 >= REQUIRED_SIZE
                && o.outHeight / scale / 2 >= REQUIRED_SIZE)
            scale *= 2;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeFile(path, o2);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    return null;

}

public String getAbsolutePath(Uri uri) {
    String[] projection = { MediaColumns.DATA };
    @SuppressWarnings("deprecation")
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if (cursor != null) {
        int column_index = cursor
                .getColumnIndexOrThrow(MediaColumns.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } else
        return null;
}


}`

这段代码有很多不同的变化,所有这些都差不多,我找到了这个,因为它允许使用相机。

问题是,无论我尝试哪个代码段,在选择或拍摄图像后返回的目录始终为null。这种情况在模拟器和手机上都会发生在各种目录中。

该应用拥有所需的权限 -

<uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"/>

当返回null时,getAbsolutePath(Uri uri)中的游标必须为null,因为这是返回null时,但我不明白为什么。

感谢所有帮助

编辑 - 我一直在添加更多日志标记,光标似乎正在传递if(cursor != null) {} 它是return cursor.getString(column_index),返回null

编辑2-整数column_index,cursor.getColumnIndexOrThrow(MediaColumns.DATA)返回0

1 个答案:

答案 0 :(得分:0)

试试这个方法可能对你有帮助

/**
 * @param contentURI
 * @return Return the selected ImagePath
 */
private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = yourContext.getContentResolver().query(contentURI,
            null, null, null, null);
    if (cursor == null) {
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor
                .getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}