10

私のアプリは、次のようなインテントでギャラリーを呼び出しています。

Intent intent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, SELECT_IMAGE_FROM_GALLERY);

バージョン < 3.0 では問題ありません。

3.0 以降のバージョンでは、ローカル イメージを取得すると、onActivityResult メソッドのインテントに次のような Uri が含まれます...

content://media/external/images/media/XXX

しかし、picasa 画像を選択すると、URI は次のようになります...

content://com.google.android.gallery3d.provider/picasa/item/XXXXXXXXXXXXXXXXXXXXX

私はその問題について多くのことを読み、多くの回避策を試しました。

現時点では、次を使用してキャッシュされた画像のみを取得できます。

getContentprovider().openInputStream(uri)

問題は、画像がキャッシュされていない場合、openInputStream(uri)メソッドがFileNotFoundExceptionをスローし、画像を取得できないことです:_(

ファイルまたはファイルをダウンロードするためのURLまたは画像を取得するためのURLを取得する方法を知っている人はいますか??

ありがとう!!

4

2 に答える 2

7

正しい解決策は、ACTION_GET_CONTENTを使用することです。その名前はACTION_PICKほど直感的に聞こえないかもしれませんが、あなたがやろうとしていることに使うべきものです。

ImageStore の URI プロバイダーをACTION_GET_CONTENT使用して指定するのではなく、ギャラリー内の画像を選択するために を使用する理由は、それが十分にサポートされているのに対し、そうではないからです。これは、Android フレームワークのエンジニアによって数回言及されています。ACTION_PICKACTION_GET_CONTENTACTION_PICK

私はそれを難し​​い方法で学びました。これについて知る前に、私はさまざまな矛盾に対処しなければなりませんでした。


これに関連するメモ

ファイルが保存されている実際のパスを取得しようとするのではなく、常に を使用して受信しopenInputStreamたファイルを取得する必要があります。実装がクラウド サービスによってサポートされている場合 (これは Picasa の場合)、または実装の詳細が時間の経過とともに変化する場合があります。ContentResolverURIContentProvider

Android のコンテンツ プロバイダを使用すると、データへのアクセス方法を抽象化できます。ファイルの場所を見つけようとするのはよくあるエラーです。通常、提案されているのは、指定された のDATA列を照会して場所を見つけることURIです。使用されるものに応じて、ContentProvider異なるものを返す可能性があり、新しいバージョンでは時間の経過とともに変化することさえあります.

を使用openInputStreamすることで、ファイルの場所を気にする必要がなくなります。バイト ストリームを受け取り、それを使ってやりたいことを実行するだけです。これにより、画像を選択するための同様のピッカー インターフェースを提供する Google ドライブ、Dropbox などの他のアプリのコンテンツ プロバイダーを問題なくサポートできます。

OPが を使用していることは知ってopenInputStreamいますが、他の回答はそうではないことを示唆しており、それは私が頻繁に目にするものです。

于 2014-08-03T23:29:50.720 に答える