Wie bekomme ich das Kameraergebnis als URI im Datenordner?
Bin ich erstellen, eine Anwendung in die ich aufnehmen möchten, ein Bild und dann will ich senden das Bild in der E-Mail als Anhang.
Öffne ich eine Kamera mit android.provider.MediaStore.ACTION_IMAGE_CAPTURE
Absicht, Aktion und ich bin übergeben Sie den Uri der Datei als parameter EXTRA_OUTPUT
um das Bild wieder in die Datei. Dieses funktioniert perfekt und ich bin in der Lage, um die aufgenommenen Bildes, wenn ich die external storage uri
als EXTRA_OUTPUT
aber wenn ich den Ordner data uri es nicht funktioniert und die Kamera nicht schließen kann und seine alle Tasten arbeiten nicht.
Hier ist mein code für das Ergebnis bekommen, das in den externen Speicher Verzeichnis
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);
Und dieser code ist für das Bild in den Ordner "data"
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);
Wusste ich, dass die Ordner Daten ist für Dritte nicht zugänglich Anwendungso kann dies verursacht ein Problem, also ich haben, erstellen Sie einen content-provider auf die Freigabe der Datei.
Hier ist mein Inhalt bieten Klasse
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);
}
}
Also zur Nutzung dieser Inhalte bieten, ich bin mit dem folgenden code zu übergeben Sie den uri an, der die Aktivität der Kamera
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);
Nun, wenn ich übergeben Sie die url anderen dann externe Speicher-Verzeichnis der Kamera öffnen aber es schließt sich nicht im emulator sondern im Gerät die Kamera wird geschlossen, aber ich bin nicht immer das Ergebnis.
Ich habe erklärt, diese Inhalte bereitzustellen, die in der manifest-Datei
<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />
Auch ich habe die Erlaubnis, Sie zu schreiben Sie den externen Speicher und auch für verwenden Sie die Kamera.
Ich bin in der Lage zu erfassen das Bild mit dem externen Speicher aber ich möchte, um das Bild zu speichern in der Daten-Verzeichnis anstelle externer Speicher, weil wenn der externe Speicher nicht verfügbar, ich möchte, um das Bild zu erfassen und wollen, um E-mail senden.
Ist, wenn ich Inhalt liefern, dann kann ich auch teilen, mein Bild an die E-Mail-Anwendung.
Wenn wir nicht die extras, die Kamera mit Absicht wird es wieder das Bild als byte[] in die Tätigkeit Ergebnis als Daten extra, aber dies ist für die Zwecke der Miniatur, so kann ich nicht das Bild in hoher Auflösung mit diesem Weg.
InformationsquelleAutor der Frage Dharmendra | 2012-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Möglichkeiten das problem zu lösen.
1. Bitmap speichern, die Sie erhalten von der onActivityResult-Methode
Können Sie starten der Kamera über die Absicht, erfassen Foto mit folgenden code
Nach der Bildaufnahme - (capture photo, erhalten Sie die bitmap in der onActivityResult-Methode
Nun können Sie einfach speichern Sie das bitmap in den internen Speicher
Hinweis: Hier bitmap-Objekt besteht aus Daumen-Bild, es wird nicht die volle Auflösung Bild
2. Speichern Sie die bitmap direkt in den internen Speicher mithilfe von content-provider
Hier erstellen wir content-provider-Klasse zu erlauben, die Erlaubnis von lokalen storage-Verzeichnis, um die Aktivität der Kamera
Beispiel Anbieter Beispiel wie unten beschrieben
Danach können Sie einfach die URI übergeben, um die Aktivität der Kamera verwenden Sie den folgenden code
Wenn Sie nicht wollen, erstellen Sie Ihre eigenen provider, dann können Sie FileProvider von support-library v4. Für detaillierte Hilfe können Sie Einblick in dieser Beitrag
InformationsquelleAutor der Antwort Dharmendra
Beste Lösung, die ich fand ist: FileProvider (braucht Unterstützung-Bibliothek-v4)
Es verwendet den internen Speicher!
https://developer.android.com/reference/android/support/v4/content/FileProvider.html
Definieren Sie Ihre FileProvider in Manifest-Dateien im Application-element:
Hinzufügen von Berechtigungen in der manifest-root-element:
Definieren Sie Ihre Bild-Pfade in zum Beispiel res/xml/image_path.xml:
Java:
4.1 erfassen Absicht:
4.2 onActivityResult():
InformationsquelleAutor der Antwort Harry
Absicht, um den Anruf zu erfassen, Foto,
Dann Nehmen Sie die Bitmap in
ActivityResult
Dann Schreiben, dass In den Internen Speicher, dies sehen
Dann Nächstes mal zu Lesen, dass die Datei,
InformationsquelleAutor der Antwort MKJParekh
Retten Sie zuerst kam Foto in Ihrem externen Speicher und versuchen Sie es -
Nächste Ziel -
InformationsquelleAutor der Antwort Suvam Roy
Können Sie dies auch tun, ohne dass ein content-Anbieter, da müssen Sie die sd-Karte zu öffnen Sie die Kamera-Bild-capture-Vorsatz sowieso. Natürlich können Sie hack um die Präsenz der sd-Karte, aber nicht mit der Absicht Kamera einzufangen....So sind Sie, die Prüfung für externe Speicherung, sondern müssen es an dieser Stelle.... FYI Sie sollten auch prüfen, eine Ernte, die Bibliothek, wie Ernte-Bild anstelle der Verwendung von native, es ist nicht gut unterstützt auf allen Geräten.
in Ihrem 'die pic' code:
...
InformationsquelleAutor der Antwort Droid Teahouse
Nach der Erforschung dieser Fehler für einige Zeit, ich habe bemerkt, dass die Aktivität, die so genannte camera intent wird nur neu gestartet, wenn auf dem Handy der Speicher ausgeht.
so, weil die Aktivität neu gestartet, das Objekt, halten Sie den Pfad oder Uri, um das aufgenommene Bild wird aktualisiert (zurückgesetzt)
also ich würde vorschlagen, Sie fangen/erkennen das null-Objekt in der onActivityResult, und fordert den Benutzer auf, Sie freien Speicherplatz auf Ihrem Gerät oder starten Sie Ihr Telefon für eine schnelle temporäre Lösung.
InformationsquelleAutor der Antwort kc ochibili