Wie bekomme ich ein Kameraergebnis als URI im Datenordner?

Ich erstelle eine Anwendung, in der ich ein Bild erfassen und dieses Bild dann in der E-Mail als Anhang senden möchte.

Ich öffne eine Kamera mitandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE Intent Action und ich übergebe den Uri der Datei als ParameterEXTRA_OUTPUT um das Bild zurück in die Datei zu bekommen. Dies funktioniert einwandfrei und ich kann das aufgenommene Bild erhalten, wenn ich das verwendeexternal storage uri Als einEXTRA_OUTPUT aber wenn ich den datenordner uri benutze, funktioniert er nicht und die kamera schließt nicht und alle tasten funktionieren nicht.

Hier ist mein Code für das Ergebnis im externen Speicherverzeichnis

<code>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);
</code>

Und dieser Code dient dazu, das Bild in den Datenordner zu bekommen

<code>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);
</code>

Ich wusste, dass dieDer Datenordner ist für die dritte Anwendung nicht zugänglich Möglicherweise verursacht dies ein Problem. Ich habe einen Inhaltsanbieter erstellt, um die Datei freizugeben.

Hier ist mein Inhalt Klasse

<code>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);

    }
}
</code>

Um diese Inhalte zu nutzen, benutze ich folgenden Code, um die URL an die Kameraaktivität weiterzuleiten

<code>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);
</code>

Wenn ich nun die URL eines anderen als des externen Speicherverzeichnisses übergebe, wird die Kamera geöffnet, aber im Emulator wird sie nicht geschlossen, aber im Gerät wird die Kamera geschlossen, aber ich erhalte nicht das Ergebnis.

Ich habe diesen Inhalt in der Manifest-Datei angegeben

<code><provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />
</code>

Auch ich habe die Erlaubnis dazu gegebenSchreiben Sie den externen Speicher und auch fürbenutze die Kamera.

Ich kann das Bild mithilfe des externen Speichers erfassen, möchte das Bild jedoch im Datenverzeichnis statt im externen Speicher speichern. Wenn der externe Speicher nicht verfügbar ist, möchte ich das Bild erfassen und E-Mails senden.

Wenn ich Inhalte zur Verfügung stelle, kann ich mein Bild auch für die E-Mail-Anwendung freigeben.

Wenn wir die Extras nicht mit der Kamera-Absicht versehen, wird das Bild als Byte [] im Aktivitätsergebnis als zusätzliches Datenelement zurückgegeben, dies dient jedoch dem Zweck der Miniaturansicht, sodass ich auf diese Weise kein hochauflösendes Bild erhalten kann .

Antworten auf die Frage(6)

Ihre Antwort auf die Frage