使用新的 Google 照片应用选择照片已损坏
Choosing photo using new Google Photos app is broken
我的应用程序可以从图库中 select 照片。正是我想要这个 selection.
的文件路径
这是为 selecting 照片创建意图的代码:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO);
这是从 URI 获取文件路径的代码:
Cursor cursor = null;
String path = null;
try {
String[] projection = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
cursor.moveToFirst();
path = cursor.getString(columnIndex);
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
在昨天更新 Google 照片应用程序之前,一切都运行良好。
现在 path
解析 URI 后为 null。
URI 类似于:content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL
我还尝试通过 Intent.ACTION_GET_CONTENT 操作创建意图 - 运气不好。
这无疑是一种解决方法,但您可以提取由于某种原因显然已嵌入的真实内容 URI:content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209
我能够使用 authority=media and path=external/images/media/xxx
创建一个新的 URI,并且内容解析器返回了一个真实的 URL。
示例代码:
String unusablePath = contentUri.getPath();
int startIndex = unusablePath.indexOf("external/");
int endIndex = unusablePath.indexOf("/ACTUAL");
String embeddedPath = unusablePath.substring(startIndex, endIndex);
Uri.Builder builder = contentUri.buildUpon();
builder.path(embeddedPath);
builder.authority("media");
Uri newUri = builder.build();
下面的代码也可以让我获取最新 Google 照片的内容 URI。
我尝试的是写入临时文件和 return 临时图像 URI,如果它在内容 URI 中具有权限。
你也可以试试:
private static String getImageUrlWithAuthority(Context context, Uri uri)
{
InputStream is = null;
if (uri.getAuthority() != null)
{
try
{
is = context.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(is);
return writeToTempImageAndGetPathUri(context, bmp).toString();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
finally
{
try
{
if (is != null)
{
is.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return null;
}
private static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
我知道这个问题有点老了,但我还是做了以下操作从图库中获取图像并使用它。下面是相同的扩展功能。
fun Uri.toBitmap(context: Context?): Bitmap {
return MediaStore.Images.Media.getBitmap(context?.contentResolver, this)
}
context作为参数获取onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?)接收到的contentResolver和Uri。
要使用,只需执行以下操作:
intent?.data.toBitmap(context)
其中 intent?.data
是从 onActivityResult() 收到的 Uri。
我的应用程序可以从图库中 select 照片。正是我想要这个 selection.
的文件路径这是为 selecting 照片创建意图的代码:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO);
这是从 URI 获取文件路径的代码:
Cursor cursor = null;
String path = null;
try {
String[] projection = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
cursor.moveToFirst();
path = cursor.getString(columnIndex);
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
在昨天更新 Google 照片应用程序之前,一切都运行良好。
现在 path
解析 URI 后为 null。
URI 类似于:content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL
我还尝试通过 Intent.ACTION_GET_CONTENT 操作创建意图 - 运气不好。
这无疑是一种解决方法,但您可以提取由于某种原因显然已嵌入的真实内容 URI:content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209
我能够使用 authority=media and path=external/images/media/xxx
创建一个新的 URI,并且内容解析器返回了一个真实的 URL。
示例代码:
String unusablePath = contentUri.getPath();
int startIndex = unusablePath.indexOf("external/");
int endIndex = unusablePath.indexOf("/ACTUAL");
String embeddedPath = unusablePath.substring(startIndex, endIndex);
Uri.Builder builder = contentUri.buildUpon();
builder.path(embeddedPath);
builder.authority("media");
Uri newUri = builder.build();
下面的代码也可以让我获取最新 Google 照片的内容 URI。 我尝试的是写入临时文件和 return 临时图像 URI,如果它在内容 URI 中具有权限。
你也可以试试:
private static String getImageUrlWithAuthority(Context context, Uri uri)
{
InputStream is = null;
if (uri.getAuthority() != null)
{
try
{
is = context.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(is);
return writeToTempImageAndGetPathUri(context, bmp).toString();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
finally
{
try
{
if (is != null)
{
is.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return null;
}
private static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
我知道这个问题有点老了,但我还是做了以下操作从图库中获取图像并使用它。下面是相同的扩展功能。
fun Uri.toBitmap(context: Context?): Bitmap {
return MediaStore.Images.Media.getBitmap(context?.contentResolver, this)
}
context作为参数获取onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?)接收到的contentResolver和Uri。
要使用,只需执行以下操作:
intent?.data.toBitmap(context)
其中 intent?.data
是从 onActivityResult() 收到的 Uri。