我正在创建一个应用程序,我想在其中捕获图像,然后我想将该图像作为附件发送到电子邮件中。
我正在使用android.provider.MediaStore.ACTION_IMAGE_CAPTURE
意图操作打开相机,并将文件的 Uri 作为参数EXTRA_OUTPUT
传递以将图像返回到文件中。external storage uri
这工作得很好,如果我使用as a ,我可以获取捕获的图像,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 传递给相机活动
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,相机正在打开,但它没有在模拟器中关闭,但在设备中,相机将关闭,但我没有得到结果。
我已在清单文件中声明此内容提供
<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />
此外,我已授予写入外部存储和使用相机的权限。
我可以使用外部存储捕获图像,但我想将图像存储在数据目录而不是外部存储中,因为如果外部存储不可用,我想捕获图像并想发送邮件。
如果我创建内容提供,那么我还可以将我的图像分享到电子邮件应用程序。
如果我们不提供带有相机意图的附加功能,它将在活动结果中将图像作为字节 [] 作为数据附加功能返回,但这是出于缩略图的目的,因此我无法使用这种方式获得高分辨率图像.