android - Android Studio 从 Gallery Intent 获取文件
问题描述
简短的回答是否可以从图库请求中获取原始文件,如果可能的话,我该怎么做?这段代码对我不起作用。
Uri uri = data.getData();
File file = new File(uri.getPath());
和长答案)):我使用此代码来制作画廊意图
addGallery.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, GALLERY_IMAGE_REQUEST);
}
});
在 mu onActivityResult 我使用这个代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK)
{
switch (requestCode)
{
case GALLERY_IMAGE_REQUEST:
if (data != null)
{
try
{
Uri uri = data.getData();
File file = new File(uri.getPath());
FileInputStream inputStream = new FileInputStream(file);
bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
inputStream.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
}
而且我无法获取文件。
从数据中获取位图的相同代码效果很好,但我需要从图库中获取准确的文件,而不仅仅是 Uri 或位图。
try
{
Uri uri = data.getData();
InputStream imageStream = getContentResolver().openInputStream(uri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
imageStream.close();
} catch (Exception e)
{
e.printStackTrace();
}
解决方案
如果您想将图片从图库导入您的应用程序(如果您的应用程序拥有它),您需要将其复制到您的应用程序数据文件夹。
在您的 onActivityResult() 中:
if (requestCode == REQUEST_TAKE_PHOTO_FROM_GALLERY && resultCode == RESULT_OK) {
try {
// Creating file
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Log.d(TAG, "Error occurred while creating the file");
}
InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
FileOutputStream fileOutputStream = new FileOutputStream(photoFile);
// Copying
copyStream(inputStream, fileOutputStream);
fileOutputStream.close();
inputStream.close();
} catch (Exception e) {
Log.d(TAG, "onActivityResult: " + e.toString());
}
}
创建文件方法:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
复制方法:
public static void copyStream(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
推荐阅读
- java - 通过代码包含布局的控制约束
- flutter - 如何在设备 Flutter 中保存缓存
- django - 给定类别的产品列表
- javascript - 使用 AJAX 将 JSON 发布到 Django 视图
- python - Python 替换文本 BeautifulSoup
- javascript - 在 IE 中使用 window.location.href 进行测试时,包含 # 的 url 会被截断
- javascript - 使用 jQuery 在文本变量中查找 div
- autodesk-designautomation - 是否可以从 InventorPlugin 中的 DWG 导出 SVF
- bash - 从 Bash 脚本运行 NPX 创建 React 应用程序
- xml - XML 中命名空间根节点的意义何在?在哪里定义这样的命名空间?