我正在开发一个应用程序,用户可以从中选择文件,相机中的新图像,图库中的图像或普通的旧文件。然后它会显示一个图标和所选项目的名称。我有这个工作有一个例外。图库应用程序集成了picasaweb图片。如果用户从picasa相册中选择了一张图片,我就无法获得缩略图。
我正在使用MediaStore.Images.Thumbnails.getThumbnail()方法,它适用于库中的其他图片,但是对于picasaweb文件,无论我尝试什么样的缩略图,我都会得到得到(尽管MICRO就是我所追求的):
ERROR / MiniThumbFile(2051):阅读魔法时出现异常,id = 5634890756050069570,磁盘已满或挂载只读?类 java.lang.IllegalArgumentException异常
我注意到为所选文件指定的URI是不同的。本地图像文件如下所示:
内容://媒体/外部/图像/媒体/ 6912
和picasaweb网址看起来像:
内容://com.android.gallery3d.provider/picasa/item/5634890756050069570
我尝试使用Thumbnails.queryMiniThumbnails()来获取原始THUMB_DATA,并在投影数组中使用Thumbnails.THUMB_DATA,但我得到了“没有这样的列”错误。
是否有其他方法可以获得更好的缩略图?当我尝试访问完整的图像数据时,我会遇到同样的问题吗?
答案 0 :(得分:2)
我发现在我的Galaxy Nexus上,Picassa的图像存储在/sdcard/Android/data/com.google.android.apps.plus/cache目录下的一个子目录中。当内容提供商是com.google.android.gallery3d.provider时,网址中“item”之后的数字包含图片的名称(在上面的示例中为“5634890756050069570”)。此数据与/sdcard/Android/data/com.google.android.apps.plus/cache下的某个子目录中的文件相对应,扩展名为“.screen”。如果您使用DDMS从手机中复制此图像(在您的情况下为5634890756050069570.screen)并使用扩展名“.jpeg”重命名,则可以打开它并在计算机上查看。
以下onActivityResult方法将检查返回的此内容提供程序,然后将递归搜索/sdcard/Android/data/com.google.android.apps.plus/cache目录中的文件。私有成员变量fileSearchPathResults由递归搜索方法walkDirectoryRecursivelySearchingForFile()填充。
private String fileSearchPathResult = null;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
String filePath = null;
// This code is required to get the image path on content providers
// on API > 10 where the image is from a picassa web album, since Google changed
// the content provider in versions with API > 10
if (selectedImage.toString().contains("com.google.android.gallery3d.provider")) {
StringBuilder contentProviderPath = new StringBuilder(selectedImage.toString());
int beginningIndex = contentProviderPath.lastIndexOf("/");
String fileNameWithoutExt = contentProviderPath.subSequence(beginningIndex + 1,
contentProviderPath.length()).toString();
Log.i(TAG, fileNameWithoutExt);
try {
File path = new File("/sdcard/Android/data/com.google.android.apps.plus/cache");
if (path.exists() && path.isDirectory()) {
fileSearchPathResult = null;
walkDirectoryRecursivelySearchingForFile(fileNameWithoutExt, path);
if (fileSearchPathResult != null) {
filePath = fileSearchPathResult;
}
}
} catch (Exception e) {
Log.i(TAG, "Picassa gallery content provider directory not found.");
}
}
}
public void walkDirectoryRecursivelySearchingForFile(String fileName, File dir) {
String pattern = fileName;
File listFile[] = dir.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isDirectory()) {
walkDirectoryRecursivelySearchingForFile(fileName, listFile[i]);
} else {
if (listFile[i].getName().contains(pattern)) {
fileSearchPathResult = listFile[i].getPath();
}
}
}
}
}
使用filePath,您可以使用以下代码创建图像的位图:
Bitmap sourceImageBitmap = BitmapFactory.decodeFile(filePath);
答案 1 :(得分:0)
ACTIVITYRESULT_CHOOSEPICTURE是调用startActivity时使用的int(intent,requestCode);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
final InputStream is = context.getContentResolver().openInputStream(intent.getData());
final Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
is.close();
}
}
该代码将加载整个图像。您可以将样本大小调整到合理的范围,以获得缩略图大小的图像。