Je suis entrain de créer une application dans laquelle je veux capturer une image et puis je veux envoyer l'image dans l'e-mail en tant que pièce jointe.
Je suis de l'ouverture d'une caméra à l'aide d' android.provider.MediaStore.ACTION_IMAGE_CAPTURE
intention d'action et je suis de passage de l'Uri du fichier comme paramètre EXTRA_OUTPUT
pour obtenir l'image dans le fichier. Cela fonctionne parfaitement, et je suis en mesure d'obtenir l'image capturée si j'utilise l' external storage uri
comme EXTRA_OUTPUT
mais si j'utilise le dossier data uri, elle ne fonctionne pas et l'appareil photo n'est pas de clôture et de son tous les boutons ne sont pas de travail.
Voici mon code pour obtenir le résultat dans le répertoire de stockage externe
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);
Et ce code est pour obtenir l'image dans le dossier de données
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);
Je savais que le dossier de données n'est pas accessible à la troisième demande donc peut-être cela provoque un problème j'ai donc créer un fournisseur de contenu à partager le fichier.
Voici le contenu de mon fournir classe
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);
}
}
Donc pour utiliser ce contenu à fournir, je suis à l'aide de code suivant pour passer à l'uri de l'activité de la caméra
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);
Maintenant, si je passe l'url, puis d'autres externes répertoire de stockage de l'appareil photo est en cours d'ouverture, mais il n'est pas de clôture dans l'émulateur, mais dans le dispositif de la caméra va fermé, mais je ne suis pas d'obtenir le résultat.
Je l'ai déclaré à ce contenu à fournir, dans le fichier de manifeste
<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />
J'ai également donné la permission d' écrire le stockage externe et aussi pour utiliser l'appareil photo.
Je suis capable de capturer l'image à l'aide de l'appareil de stockage externe, mais je veux stocker l'image dans le répertoire de données au lieu de stockage externe, parce que si le stockage externe n'est pas disponible je veux capturer l'image et que vous voulez envoyer du courrier.
Si je créer du contenu fournissent ensuite, je peux aussi partager mon image à l'application e-mail.
Si nous fournissez pas les extras avec l'appareil photo de l'intention, il sera de retour l'image comme un byte[] dans l'activité résultat sous forme de données supplémentaire, mais c'est dans le but de la vignette, donc je ne peux pas obtenir l'image à haute résolution à l'aide de cette façon.
Jetez un oeil dans ma question et donner vos suggestions. Merci.