获得Android的选择的图像文件的位置(Get Selected Image File Locat

2019-09-26 13:31发布

我目前正在与图像工作的应用程序。 我需要实现在用户选取存储在SD卡上的文件的功能。 一旦他们选择的图片(使用Android画廊),图像的文件,位置将被发送到另一个活动,而其他工作将在其完成。

我在这里就没有见过这样类似的帖子,但没有具体回答我的问题。 基本上,这是当用户点击“加载图片”按钮,我做的代码:

// Create a new Intent to open the picture selector:
Intent loadPicture = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

// To start it, run the startActivityForResult() method:
startActivityForResult(loadPicture, SELECT_IMAGE);

从这个代码,然后我有一个onActivityResult()方法来听回拨:

// If the user tried to select an image:
if(requestCode == SELECT_IMAGE)
{
    // Check if the user actually selected an image:
    if(resultCode == Activity.RESULT_OK)
    {
        // This gets the URI of the image the user selected:
        Uri selectedImage = data.getData();

        // Create a new Intent to send to the next Activity:
        Intent i = new Intent(currentActivty.this, nextActivity.class);

        // ----------------- Problem Area -----------------
        // I would like to send the filename to the Intent object, and send it over.
        // However, the selectedImage.toString() method will return a
        // "content://" string instead of a file location.  How do I get a file
        // location from that URI object?
        i.putExtra("PICTURE_LOCATION", selectedImage.toString());

        // Start the activity outlined with the Intent above:
        startActivity(i);

作为上述状态的代码,所述uri.toString()将返回一个content://串,而不是所选择的图像的文件的位置。 我如何获取该文件的位置?

注:另一种可能的解决方案是送过来的content://串并转换是成Bitmap (这是在接下来的活动会发生什么)。 不过,我不知道该怎么做。

Answer 1:

我已经找到了答案,以我自己的问题。 做一些更多的搜索后,我终于偶然发现这里的SO后其在这里问了同样的问题: 由Uri.getPath安卓得到真实路径() 。

遗憾的是,答案有断开的链接。 经过一番搜索谷歌,我找到了正确的链接到该网站在这里: http://www.androidsnippets.org/snippets/130/ (我已经验证该代码确实工作)

不过,我决定采取不同的路线。 由于我的下一个活动时使用ImageView显示图片,我反而要使用开放的内容串链接到下一个活动的所有方法。

在接下来的活动中,我使用了ImageView.setImageUri()方法。

这里是我在接下来的活动做显示从图片中的代码content://字符串:

// Get the content string from the previous Activity:
picLocation = getIntent().getStringExtra("PICTURE_LOCATION");

// Instantiate the ImageView object:
ImageView imageViewer = (ImageView)findViewById(R.id.ImageViewer);

// Convert the Uri string into a usable Uri:
Uri temp = Uri.parse(picLocation);
imageViewer.setImageURI(temp);

我希望这个问题和答案将有助于未来的Android开发。



Answer 2:

这里的另一个答案,我希望有人认为有用:

您可以在MediaStore任何内容做到这一点。 在我的应用程序,我要得到的URI路径和路径得到URI。 前者:

/**
 * Gets the corresponding path to a file from the given content:// URI
 * @param selectedVideoUri The content:// URI to find the file path from
 * @param contentResolver The content resolver to use to perform the query.
 * @return the file path as a string
 */
private String getFilePathFromContentUri(Uri selectedVideoUri,
        ContentResolver contentResolver) {
    String filePath;
    String[] filePathColumn = {MediaColumns.DATA};

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

后者(我为视频做的,但也可以通过为MediaStore.Video代MediaStore.Audio(等)被用于音频或文件或其他类型的存储的内容的:

/**
 * Gets the MediaStore video ID of a given file on external storage
 * @param filePath The path (on external storage) of the file to resolve the ID of
 * @param contentResolver The content resolver to use to perform the query.
 * @return the video ID as a long
 */
private long getVideoIdFromFilePath(String filePath,
        ContentResolver contentResolver) {


    long videoId;
    Log.d(TAG,"Loading file " + filePath);

            // This returns us content://media/external/videos/media (or something like that)
            // I pass in "external" because that's the MediaStore's name for the external
            // storage on my device (the other possibility is "internal")
    Uri videosUri = MediaStore.Video.Media.getContentUri("external");

    Log.d(TAG,"videosUri = " + videosUri.toString());

    String[] projection = {MediaStore.Video.VideoColumns._ID};

    // TODO This will break if we have no matching item in the MediaStore.
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(projection[0]);
    videoId = cursor.getLong(columnIndex);

    Log.d(TAG,"Video ID is " + videoId);
    cursor.close();
    return videoId;
}

基本上, DATA的列MediaStore (或它要查询哪个小节)存储的文件路径,让你用你知道来查找数据的东西,或者你在查询DATA字段选择你所关心的内容关于。



文章来源: Get Selected Image File Location in Android