gpt4 book ai didi

android - 如何将相机结果作为数据文件夹中的 uri 获取?

转载 作者:IT老高 更新时间:2023-10-28 13:17:14 26 4
gpt4 key购买 nike

我正在创建一个应用程序,我想在其中捕获图像,然后我想将该图像作为附件发送到电子邮件中。

我正在使用 android.provider.MediaStore.ACTION_IMAGE_CAPTURE Intent 操作打开相机,并将文件的 Uri 作为参数 EXTRA_OUTPUT 传递以获取图像到文件。这是完美的工作,如果我使用 external storage uri 作为 EXTRA_OUTPUT 但如果我使用数据文件夹 uri 它无法正常工作并且相机没有关闭,所有按钮都不起作用。

这是我在外部存储目录中获取结果的代码

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = Environment.getExternalStorageDirectory();
out = new File(out, imagename);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);

此代码用于获取数据文件夹中的图像

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = getFilesDir();
out = new File(out, MyPharmacyOptions.PRESCRIPTION_IMAGE_NAME);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);

我知道 第三个应用程序无法访问数据文件夹,因此这可能会导致问题,因此我创建了一个内容提供程序来共享该文件。

这是我的内容提供类

public class MyContentProvider extends ContentProvider {
private static final String Tag = RingtonContentProvider.class.getName();
public static final Uri CONTENT_URI = Uri
.parse("content://x.y.z/");
private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>();

static {
MIME_TYPES.put(".mp3", "audio/mp3");
MIME_TYPES.put(".wav", "audio/mp3");
MIME_TYPES.put(".jpg", "image/jpeg");
}

@Override
public boolean onCreate() {
return true;
}

@Override
public String getType(Uri uri) {
String path = uri.toString();

for (String extension : MIME_TYPES.keySet()) {
if (path.endsWith(extension)) {
return (MIME_TYPES.get(extension));
}
}

return (null);
}

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
File f = new File(getContext().getFilesDir(), uri.getPath());

if (f.exists()) {
return (ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
}

throw new FileNotFoundException(uri.getPath());
}

@Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
throw new RuntimeException("Operation not supported");
}

@Override
public Uri insert(Uri uri, ContentValues initialValues) {
File file = new File(getContext().getFilesDir(), uri.getPath());
if(file.exists()) file.delete();
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return Uri.fromFile(file);
}

@Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs) {
throw new RuntimeException("Operation not supported");
}

@Override
public int delete(Uri uri, String where, String[] whereArgs) {
File f = new File(getContext().getFilesDir(), "image1.jpg");
if(f.exists()) f.delete();
f = new File(getContext().getFilesDir(), "image2.jpg");
if(f.exists()) f.delete();

getContext().getContentResolver().notifyChange(CONTENT_URI, null);

}
}

所以要使用此内容,我使用以下代码将 uri 传递给相机 Activity

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = MyContentProvider.CONTENT_URI;
uri = Uri.withAppendedPath(uri, imagename);
getContentResolver().insert(uri, null);
getContentResolver().notifyChange(RingtonContentProvider.CONTENT_URI, null);
Log.d(Tag, uri.toString());
i.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(i, CAMERA_RESULT);

现在,如果我通过外部存储目录以外的 url,相机正在打开,但它没有在模拟器中关闭,但在设备中,相机将关闭,但我没有得到结果。

我已在 list 文件中声明此内容提供

<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />

我也已授权写入外部存储以及使用相机

我可以使用外部存储捕获图像,但我想将图像存储在数据目录而不是外部存储中,因为如果外部存储不可用,我想捕获图像并想发送邮件。

如果我创建内容提供,那么我也可以将我的图像分享到电子邮件应用程序。

如果我们不提供带有相机 Intent 的附加功能,它将在 Activity 结果中将图像作为字节 [] 作为数据附加功能返回,但这是出于缩略图的目的,因此我无法获取使用这种方式的高分辨率图像。

最佳答案

有两种方法可以解决这个问题。

1.保存您从 onActivityResult 方法收到的位图

您可以通过 Intent 启动相机以使用以下代码拍摄照片

Intent cameraIntent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);

抓拍照片后,你会在onActivityResult方法中得到位图

if (requestCode == CAMERA_REQUEST) {  
Bitmap photo = (Bitmap) data.getExtras().get("data");
}

现在您可以简单地将这个位图保存到内部存储中

注意:这里的位图对象由拇指图像组成,它不会有全分辨率图像

<强>2。使用内容提供程序将位图直接保存到内部存储

这里我们将创建内容提供者类以允许本地存储目录对相机 Activity 的权限

以下示例提供者示例

public class MyFileContentProvider extends ContentProvider {
public static final Uri CONTENT_URI = Uri.parse
("content://com.example.camerademo/");
private static final HashMap<String, String> MIME_TYPES =
new HashMap<String, String>();

static {
MIME_TYPES.put(".jpg", "image/jpeg");
MIME_TYPES.put(".jpeg", "image/jpeg");
}

@Override
public boolean onCreate() {

try {
File mFile = new File(getContext().getFilesDir(), "newImage.jpg");
if(!mFile.exists()) {
mFile.createNewFile();
}
getContext().getContentResolver().notifyChange(CONTENT_URI, null);
return (true);
} catch (Exception e) {
e.printStackTrace();
return false;
}

}

@Override
public String getType(Uri uri) {
String path = uri.toString();

for (String extension : MIME_TYPES.keySet()) {
if (path.endsWith(extension)) {
return (MIME_TYPES.get(extension));
}
}
return (null);
}

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {

File f = new File(getContext().getFilesDir(), "newImage.jpg");
if (f.exists()) {
return (ParcelFileDescriptor.open(f,
ParcelFileDescriptor.MODE_READ_WRITE));
}
throw new FileNotFoundException(uri.getPath());
}
}

之后,您可以使用以下代码简单地使用 URI 传递给相机 Activity

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, MyFileContentProvider.CONTENT_URI);
startActivityForResult(i, CAMERA_RESULT);

如果您不想创建自己的提供程序,那么您可以使用 FileProvider来自支持库-v4。如需详细帮助,您可以查看 this post

关于android - 如何将相机结果作为数据文件夹中的 uri 获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10042695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com