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

Schreibe einen Kommentar