ICS を実行している Nexus S で Thumbnails.getThumbnail を picasa の写真と連携させるのに苦労しています。picasa から元の画像を取得して表示するなど、他のすべては機能しているようですが、getThumbnail は機能していないようです。使用しようとすると、次のエラーが表示されます。
E/MiniThumbFile( 1852): Got exception when reading magic, id = 5745625138093120418, disk full or mount read-only? class java.lang.IllegalArgumentException
W/MediaProvider( 540): original media doesn't exist or it's canceled.
ディスクはいっぱいではなく、読み書き可能で、アプリには外部ストレージの書き込み権限があり、写真は実際に picasa に存在します (Android ギャラリー アプリで表示できます)。
同じコードは Android 2.3 でも問題なく動作しますが、わずかに異なるパスをたどります。2.3 は写真のコピーをダウンロードし、コンテンツを渡すのではなく、実際のローカル file:// uri を新しくダウンロードした画像に渡すように見えるためです。 ://uri.
これは問題のコードの主な内容です:
public void addImage(Uri uri, boolean local)
{
ContentResolver resolver = getContentResolver();
Uri actualUri = uri;
Log.d(TAG, "addImage: original uri: " + uri.toString());
if(local) {
try {
List<String> uriPath = uri.getPathSegments();
String contentUri = Media.insertImage(resolver, uri.getPath(), uriPath.get(uriPath.size()-1), new String());
actualUri = Uri.parse(contentUri);
}
catch(java.io.FileNotFoundException ex) {
Log.e(TAG, "FileNotFoundException: ");
ex.printStackTrace();
}
}
Log.d(TAG, "addImage: actual uri: " + actualUri.toString());
List<String> uriPath = actualUri.getPathSegments();
long imageId = Long.parseLong(uriPath.get(uriPath.size() -1));
Bitmap thumb = Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MINI_KIND, null);
if(thumb == null) {
Log.e(TAG, "Failed to get thumbnail for our image.");
Toast toast = Toast.makeText(getApplicationContext(), "Failed to get thumbnail for image. Please try again.", Toast.LENGTH_SHORT);
toast.show();
return;
}
uris.add(uri);
bmps.add(thumb);
notifyDataSetChanged();
}
このメソッドは、アプリケーションの写真の「コレクション」に新しい写真が追加されるたびに呼び出されます。ローカル イメージであることがわかっている場合 (つまり、写真がアプリ内から撮影された場合、または onActivityResult のデータ引数が null の場合)、ローカル パラメータは true に設定され、コンテンツから content:// uri を取得しようとします。 Thumbnails.getThumbnail に渡す有効な画像 ID を取得できるようにします。このコードは、(startActivityForResult を介して) カメラ アプリから取得した画像と、デバイスにローカルに保存されているギャラリーの画像に対して正常に機能します。
私は少し困惑しています。