Jak uložit data z fotoaparátu na disk pomocí MediaStore o Androidu?

hlasů
10

Pro mé žádosti, jsem byl s použitím mé vlastní třídy Camera pro pořizování snímků a svou vlastní databázi, ale brzy jsem se opravdu nemohli držet krok se změnami a rozhodl jsem se použít vestavěný v aplikaci fotoaparátu v Androidu dělat práci, ale nedaří se mi dostat se do uložit soubor. Co jsem zde chybí? Aplikace Zdá se, že uložení souboru, ale je to jen 0 bajtů. Vzhlédla jsem zdrojový kód aplikace fotoaparátu a to při pohledu na „výstup“ v Extras pro uložení souboru. Pomoci by bylo velmi ocenil.

Public class CameraTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button cameraButton = (Button) findViewById(R.id.cameraButton);
        cameraButton.setOnClickListener( new OnClickListener(){
            public void onClick(View v ){
                ContentValues values = new ContentValues();
                values.put(Images.Media.TITLE, title);
                values.put(Images.Media.BUCKET_ID, test);
                values.put(Images.Media.DESCRIPTION, test Image taken);
                Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent(android.media.action.IMAGE_CAPTURE);
                intent.putExtra(output, uri.getPath());
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode== 0 && resultCode == Activity.RESULT_OK){
            ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData());
        }
    }


}
Položena 16/03/2009 v 03:22
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
14

Tato pracoval s následujícím kódem, udělil jsem byl trochu hloupý s tím posledním. Pořád si myslím, že to musí být lepší způsob, takže původní snímek je stále uloženy někde. To mi pořád posílá obraz velikosti menší 25%.

public class CameraTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button cameraButton = (Button) findViewById(R.id.cameraButton);
    cameraButton.setOnClickListener( new OnClickListener(){
        public void onClick(View v ){

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

            startActivityForResult(intent,0);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) {
        Bitmap x = (Bitmap) data.getExtras().get("data");
        ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x);
        ContentValues values = new ContentValues();
        values.put(Images.Media.TITLE, "title");
        values.put(Images.Media.BUCKET_ID, "test");
        values.put(Images.Media.DESCRIPTION, "test Image taken");
        values.put(Images.Media.MIME_TYPE, "image/jpeg");
        Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
        OutputStream outstream;
        try {
            outstream = getContentResolver().openOutputStream(uri);
            x.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
            outstream.close();
        } catch (FileNotFoundException e) {
            //
        } catch (IOException e) {
            //
        }
    }
}

Také vím, že uvolnění košíček z Android by měl brzy opravit malou velikost obrazu.

Odpovězeno 16/03/2009 v 04:31
zdroj uživatelem

hlasů
6

Níže uvedený kód spustí výchozí kameru a mít fotoaparát snímek uložit do zadaného URI. Klíčem k úspěchu je dát extra „MediaStore.EXTRA_OUTPUT“ spolu s požadovaným URI.

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg");
Uri imageUri = Uri.fromFile(file);

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, 0);
Odpovězeno 01/09/2011 v 22:20
zdroj uživatelem

hlasů
4

FYI, našel na dokumenty: Volající může projít další EXTRA_OUTPUT ke kontrole, kde tento obraz bude v písemné formě. V případě, že EXTRA_OUTPUT není přítomen, pak malé velikosti obrazu je vrácena jako objekt Bitmap v další oblasti. To je užitečné pro aplikace, které potřebují pouze malý obrázek. Pokud je přítomen EXTRA_OUTPUT, pak full-sized image bude zapsán na hodnotu URI EXTRA_OUTPUT.

Nachází se zde: http://developer.android.com/reference/android/provider/MediaStore.html

takže aplikace může uložit obrázek v plné velikosti pro vás, pokud si ho tam, kde chcete.

** Edit: Toto není případ zařízeních HTC. HTC (ne nexus), který používá HTC Sense UI již odbočoval z Android 1.5 a nesou chybu, která vždy uložit obraz s nízkým rozlišením. můžete oběd aktivitu pro kameru a pomocí funkce sdílení z kamery používat plné velikosti obrazu.

Odpovězeno 28/06/2010 v 08:25
zdroj uživatelem

hlasů
4

Ve svém prvním pokusu, mohlo by se stát, že aplikace Camera zhroutí, když čte svůj „výkon“ extra, protože se očekává, že se jedná o Uri, když uvedete řetězec. Aplikace Camera Zdá se, že si přečíst další příznak po pořízení snímku. Ty by měly pouze poskytnout URI a nikoli uri.getPath (). Potom, protože již víte URI k fotce, nebude vrácen v onResult hovoru. Musíte si uvědomit, URI v členské proměnné.

Ve druhém pokusu dostanete zmenšená (50%) bitmapu zpět. Je určen především pro pohledy. Myslím, že v plné velikosti bitmap je příliš velká pro rozpočet paměti aplikace. To může být důvodem pro downscale.

Odpovězeno 24/08/2009 v 12:57
zdroj uživatelem

hlasů
0

Mám stejný problém s emulátorem, Zkoušel jsem to na skutečném mobilnímu telefonu to fungovalo, možná je to proto, že virtuální telefonní nemohou se opravdu Picures.

Odpovězeno 25/03/2010 v 18:53
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more