Jak uzyskać wynik kamery jako uri w folderze danych?

Tworzę aplikację, w której chcę przechwycić obraz, a następnie chcę wysłać ten obraz w wiadomości e-mail jako załącznik.

Otwieram kamerę za pomocąandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE zamierzone działanie i przekazuję Uri pliku jako parametrEXTRA_OUTPUT aby przywrócić obraz do pliku. To działa doskonale i jestem w stanie uzyskać przechwycony obraz, jeśli użyjęexternal storage uri jakEXTRA_OUTPUT ale jeśli korzystam z folderu danych uri, to nie działa i kamera nie zamyka się, a wszystkie przyciski nie działają.

Oto mój kod, aby uzyskać wynik w zewnętrznym katalogu pamięci

<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>

Ten kod służy do pobierania obrazu do folderu danych

<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>

Wiedziałem, żefolder danych nie jest dostępny dla trzeciej aplikacji więc może to powodować problem, więc utworzyłem jednego dostawcę treści, aby udostępnić plik.

Oto moje treści, które zapewniają klasę

<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>

Aby użyć tej zawartości, używam następującego kodu, aby przekazać uri do aktywności kamery

<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>

Teraz, jeśli przekazam adres URL innego niż zewnętrzny katalog pamięci, kamera się otwiera, ale nie zamyka się w emulatorze, ale w urządzeniu kamera się zamknie, ale nie otrzymam wyniku.

Oświadczyłem, że ta treść znajduje się w pliku manifestu

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

Również dałem pozwolenienapisz pamięć zewnętrzną a także dlaużyj aparatu.

Jestem w stanie przechwycić obraz za pomocą pamięci zewnętrznej, ale chcę zapisać obraz w katalogu danych zamiast pamięci zewnętrznej, ponieważ jeśli pamięć zewnętrzna nie jest dostępna, chcę przechwycić obraz i wysłać pocztę.

Jeśli tworzę treść, to mogę również udostępnić mój obraz aplikacji e-mail.

Jeśli nie udostępnimy dodatków z intencją aparatu, obraz zostanie zwrócony jako bajt [] w wyniku działania jako dodatek do danych, ale jest to dla celów miniatury, więc nie mogę uzyskać obrazu o wysokiej rozdzielczości w ten sposób .

questionAnswers(6)

yourAnswerToTheQuestion