使用picasa的存储访问框架

时间:2014-02-10 22:45:53

标签: android storage-access-framework

使用新的Storage Access Framework作为图像的内容选择器,如何将结果文件作为位图?如果内容是手机的本地内容,则可以轻松完成,如下面的代码所示。但是,如果内容来自像picasa或谷歌驱动器或盒子这样的地方,则无法访问内容,因为BitmapFactory.decodeStream(InputStream)始终返回false。有解决方案吗?

// launch the new UI picker
Intent docsIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
docsIntent.addCategory(Intent.CATEGORY_OPENABLE);
docsIntent.setType("image/*");
startActivityForResult(docsIntent, 556);


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Uri uri = data.getData();
    // removed threading logic for easy of reading
    ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fd = pfd.getFileDescriptor();
    Bitmap bm = BitmapFactory.decodeFileDescriptor(fd); // null for picasa
    pfd.close();

    InputStream is = getContentResolver().openInputStream(uri);
    Bitmap bm2 = BitmapFactory.decodeStream(is); // null for picasa

     // nothing in the cursor that would point to a url to get the document. 
     Cursor c = getContentResolver().query(uri, null, null, null, null);
     if (c != null) {
        String[] names = c.getColumnNames();
        while (c.moveToNext()) {
            int columnCount = c.getColumnCount();
            int i =0;
            while (i<columnCount) {
                String value = c.getString(i);
                String columnName = c.getColumnName(i);
                Log.d("Junk", columnName + " : " + value);
                i++;
            }
        }
    }

}

2 个答案:

答案 0 :(得分:1)

Kumar Bibek编写了一个非常好的ImageChooser库来管理大多数场景。我知道它可以处理Picasa。

您可以在以下位置找到他的项目: https://github.com/coomar2841/image-chooser-library

答案 1 :(得分:0)

<强>解决: 好吧,事实证明以上所有代码都运行得很好。当来自最近类别的新UI选择器时,它显示的是过时的图像,它似乎不存在。这可以解释为什么图像不会加载。