Domanda

Per la mia applicazione, stavo usando la mia classe Camera per acquisire immagini e il mio database, ma presto non sono riuscito a tenere il passo con le modifiche e ho deciso di utilizzare l'applicazione fotocamera integrata in Android per fare il lavoro, ma non riesco a trovarlo per salvare il file. Cosa mi sto perdendo qui? L'applicazione sembra salvare il file ma è solo 0 byte. Ho cercato il codice sorgente dell'applicazione Camera e sta cercando "output" in Extra per salvare il file. Qualsiasi aiuto sarebbe molto apprezzato.

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());
        }
    }


}
È stato utile?

Soluzione

Funzionava con il seguente codice, ammesso che fossi un po 'stupido con l'ultimo. Penso ancora che ci debba essere un modo migliore in modo che l'immagine originale venga ancora salvata da qualche parte. Mi manda ancora l'immagine con dimensioni inferiori del 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) {
            //
        }
    }
}

Inoltre, so che la versione cupcake di Android dovrebbe correggere presto le dimensioni ridotte dell'immagine.

Altri suggerimenti

Il codice seguente avvierà la videocamera predefinita e farà salvare la videocamera all'URI specificato. La chiave è mettere il "MediaStore.EXTRA_OUTPUT " extra" insieme con l'uri desiderato.

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

Al primo tentativo, è possibile che l'app Fotocamera si blocchi in modo anomalo quando legge il tuo "output" extra, poiché si aspetta che sia un Uri, mentre si fornisce una stringa. L'app Fotocamera sembra leggere la bandiera extra dopo aver catturato la foto. Dovresti semplicemente fornire uri e non uri.getPath (). Quindi, poiché conosci già l'URI della foto, non verrà restituito nella chiamata onResult. Devi ricordare l'URI in una variabile membro.

Nel secondo tentativo otterrai una bitmap ridotta (50%). È principalmente destinato alle viste. Penso che la bitmap full size sia troppo grande per il budget di memoria dell'applicazione. Questo potrebbe essere il motivo del downscale.

Cordiali saluti, l'ho trovato su documenti: Il chiamante può passare un EXTRA_OUTPUT extra per controllare dove verrà scritta questa immagine. Se EXTRA_OUTPUT non è presente, viene restituita un'immagine di dimensioni ridotte come oggetto Bitmap nel campo aggiuntivo. Ciò è utile per le applicazioni che richiedono solo una piccola immagine. Se EXTRA_OUTPUT è presente, l'immagine a dimensione intera verrà scritta nel valore Uri di EXTRA_OUTPUT.

situato qui: http://developer.android.com/reference/ Android / fornitore / MediaStore.html

in modo che l'app possa salvare l'immagine a dimensione intera per te, se dici dove.

** Modifica: questo non è il caso dei dispositivi HTC. HTC (non Nexus) che utilizza htc sense ui si è ramificato da Android 1.5 e porta un bug che salva sempre l'immagine a bassa risoluzione. puoi pranzare attività per la fotocamera e utilizzare la funzione di condivisione dalla fotocamera per utilizzare l'immagine a dimensione intera.

Ho avuto lo stesso problema con l'emulatore, L'ho provato su un vero telefono e ha funzionato, forse è perché il Virtual Phone non può davvero scattare foto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top