【问题标题】:Retrieve Picasa Image for Upload from Gallery从图库中检索要上传的 Picasa 图像
【发布时间】:2023-04-08 19:54:01
【问题描述】:

我正在处理一项活动和相关任务,允许用户从图库中选择一张图片用作他们的个人资料图片。一旦做出选择,图像就会通过其 API 上传到 Web 服务器。我有这个来自画廊的工作常规图像。但是,如果所选图片来自 Picasa 网络相册,则不会返回任何内容。

我做了很多调试,把问题缩小到这个方法。

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    //cursor is null for picasa images
    if(cursor!=null)
    {
        int column_index = cursor
        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    else return null;
}

Picasa 图像返回空光标。但是,MediaStore.Images.Media.DATA 对它们来说为空。它只返回一个#id,所以我猜测该地址没有实际的位图数据。 Picasa 图像是否完全存储在设备本地?

我还从文档中注意到 MediaStore.Images.ImageColumns.PICASA_ID 存在。此值适用于选定的 picasa 图片,但不适用于其他图库图片。我在想我可以使用这个值来获取图像的 URL,如果它没有存储在本地,但我在任何地方都找不到关于它的任何信息。

【问题讨论】:

  • 这里是 dsk 8-13 的完整、更准确的工作代码:dimitar.me/…

标签: android picasa


【解决方案1】:

我也遇到了同样的问题,
最后,我找到的解决方案是启动 ACTION_GET_CONTENT 意图而不是 ACTION_PICK,然后确保为临时文件提供带有 uri 的 MediaStore.EXTRA_OUTPUT 额外内容。 这是启动意图的代码:

public class YourActivity extends Activity {
    File mTempFile;
    int REQUEST_CODE_CHOOSE_PICTURE = 1;

    (...)
    public showImagePicker() { 
        mTempFile = getFileStreamPath("yourTempFile");
        mTempFile.getParentFile().mkdirs();
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        intent.setType("image/*");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile));
        intent.putExtra("outputFormat",Bitmap.CompressFormat.PNG.name());                       
        startActivityForResult(intent,REQUEST_CODE_CHOOSE_PICTURE);
    }

    (...)
}

你可能需要 mTempFile.createFile()

然后在onActivityResult中,就可以通过这种方式获取图片了

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    case REQUEST_CODE_CHOOSE_PICTURE:
                Uri imageUri = data.getData();
                if (imageUri == null || imageUri.toString().length() == 0) {
                    imageUri = Uri.fromFile(mTempFile);
                    file = mTempFile;
                }
                                    if (file == null) {
                                       //use your current method here, for compatibility as some other picture chooser might not handle extra_output
                                    }
}

希望对你有帮助

然后你应该在完成时删除你的临时文件(它在内部存储中,但你可以使用外部存储,我想这会更好)。

【讨论】:

  • file = mTempFile 行到底在做什么?文件从哪里来?那是存储位图的地方吗?
  • 它的启动是:mTempFile = getFileStreamPath("yourTempFile");
  • 我了解 mTempFile 的来源。变量文件从何而来?我没有看到它设置在任何地方。
  • getFileStreamPath("yourTempFile"); 将在您的应用程序目录 (/data/app/package/files/yourTempFile) 中创建一个文件名“yourTempFile”。如果您愿意,可以使用其他路径对其进行初始化。这只是获取文件的简单方法。唯一重要的是为您的意图提供一个 uri,以便在选择 picasa 图片时填充文件。
  • 所以我一切正常。但是,选择 Picasa 图像后,它们将存储在图库中的“下载”中。在获得所需的位图后,我尝试调用 mTempFile.delete(),但它们仍然被保存。
【解决方案2】:

您为什么使用managedQuery() 方法?该方法已弃用。

如果您想将 Uri 转换为 Bitmap 对象,请尝试以下代码:

public Bitmap getBitmap(Uri uri) {

    Bitmap orgImage = null;
    try {
        orgImage = BitmapFactory.decodeStream(getApplicationContext().getContentResolver().openInputStream(uri));
    } catch (FileNotFoundException e) {
        // do something if you want
    }
    return orgImage;
}

【讨论】:

  • 是的,这对我有用.. 当我们从意图中获取 uri 时,无论它来自设备库还是来自 picasa 图像,它都会将文件保存在位图中,在这种情况下会向我们发送“content://com .google.android.gallery3d"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多