1

新しい Storage Access Framework を画像のコンテンツ ピッカーとして使用して、結果のファイルをビットマップとして取得するにはどうすればよいですか? コンテンツが電話にローカルな場合、これは以下のコードに示すように簡単に実行できます。ただし、コンテンツが picasa や google ドライブまたはボックスなどの場所からのものである場合、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++;
            }
        }
    }

}
4

2 に答える 2

1

Kumar Bibek は、ほとんどのシナリオを管理する非常に優れた ImageChooser ライブラリを作成しました。Picasa を処理できることは確かです。

彼のプロジェクトは https://github.com/coomar2841/image-chooser-libraryにあります。

于 2014-02-10T23:31:24.237 に答える
0

解決済み: 上記のコードはすべて問題なく動作することがわかりました。最近のカテゴリの新しい UI ピッカーから来ると、存在しないように見える古い画像が表示されます。これにより、画像が読み込まれない理由が説明されます。

于 2014-02-10T23:38:34.313 に答える