Я создаю приложение, в котором я хочу захватить изображение, а затем я хочу отправить это изображение в электронное письмо как вложение.
Я открываю камеру с использованием действия android.provider.MediaStore.ACTION_IMAGE_CAPTURE
намерения, и я передаю 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 активности камеры.
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" />
Также я дал разрешение записать внешнее хранилище, а также для использовать камеру.
Я могу захватить изображение, используя внешнее хранилище, но хочу сохранить изображение в каталоге данных вместо внешнего хранилища, потому что, если внешнее хранилище недоступно, я хочу сделать снимок и отправить почту.
Если я создам контент, я также могу поделиться своим изображением с почтовым приложением.
Если мы не предоставим дополнительные функции с намерением камеры, оно вернет изображение в виде байта [] в результате операции в качестве дополнительных данных, но это предназначено для эскиза, поэтому я не могу получить изображение с высоким разрешением, используя этот способ.
Пожалуйста, загляните в мой вопрос и дайте свои предложения. Спасибо.