Frage

Für meine Bewerbung hatte ich schon für meine eigene Kamera-Klasse mit Bildern und meine eigene Datenbank nimmt aber bald genug konnte ich nicht wirklich mit den Veränderungen Schritt halten und ich beschloß, in Kamera-Anwendung, die gebaut zu verwenden, in Android das zu tun Job, aber ich kann nicht scheinen, es Datei zu speichern zu bekommen. Was bin ich hier? Die Anwendung scheint die Datei zu speichern, aber es ist nur 0 Byte. Ich sah aus dem Quellcode der Kamera-Anwendung und es ist für den „Ausgang“ in Extras suchen, um die Datei zu speichern. Jede Hilfe wäre sehr geschätzt.

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


}
War es hilfreich?

Lösung

Das funktionierte mit dem folgenden Code, gewährt wurde ich mit dem letzten ein wenig dumm zu sein. Ich denke immer noch, es muss ein besserer Weg sein, so dass das Originalbild immer noch irgendwo gespeichert wird. Es schickt mir immer noch die kleinere 25% Bildauflösung.

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) {
            //
        }
    }
}

Auch ich weiß, dass die kleine Kuchen Veröffentlichung von Android sollte die kleine Bildgröße schnell beheben.

Andere Tipps

Der Code unten wird die Standard-Kamera starten und die Kamera das Bild auf die angegebene uri speichern. Der Schlüssel ist, die extra „MediaStore.EXTRA_OUTPUT“ zusammen mit dem gewünschten uri zu setzen.

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

In Ihrem ersten Versuch, es könnte die Kamera-App stürzt ab, dass, wenn es liest Ihr „Ausgang“ extra, da sie es erwartet ein Uri zu sein, während Sie einen String liefern. Der Kamera-App scheint den zusätzlichen Flag nach der Erfassung der Bilder zu lesen. Sie sollten nur uri bieten, und nicht uri.getPath (). Dann wird, da Sie bereits die URI zu dem Foto kennen, wird es nicht in dem onResult Aufruf zurückgegeben werden. Sie müssen den URI in einer Membervariable erinnern.

Im zweiten Versuch bekommen Sie eine abgespeckte (50%) Bitmap zurück. Es ist in erster Linie für die Ansichten bestimmt. Ich denke, die in voller Größe Bitmap für den Speicher Haushalt der Anwendung zu groß ist. Dies kann der Grund für den absteuernd sein.

FYI, fanden diese auf docs: Der Anrufer kann eine zusätzliche EXTRA_OUTPUT passieren zu kontrollieren, wo das Bild geschrieben werden. Wenn die EXTRA_OUTPUT nicht vorhanden ist, dann wird eine kleine Größe Bild als ein Bitmap-Objekt in dem zusätzlichen Feld zurückgegeben. Dies ist nützlich für Anwendungen, die nur ein kleines Bild benötigen. Wenn die EXTRA_OUTPUT vorhanden ist, dann wird das Bild in voller Größe wird auf den Uri-Wert von EXTRA_OUTPUT geschrieben werden.

befindet sich hier: http://developer.android.com/reference/ android / Anbieter / MediaStore.html

so die App Bild in voller Größe für Sie sparen können, wenn Sie es sagen, wo.

** Edit: Dies ist nicht der Fall mit HTC-Geräten. HTC (nicht Nexus), die HTC Sense UI verwendet hat von Android 1.5 abgezweigt und einen Fehler tragen, die das Bild in geringer Auflösung immer speichern. Sie Mittagessen Aktivität für Kamera kann und die Share-Funktion von der Kamera die volle Größe Bild verwenden verwenden.

Ich habe das gleiche Problem mit dem Emulator, Ich versuchte es auf einem echten Telefon ein es funktionierte, Vielleicht ist es, weil die Virtual Phone kann nicht wirklich Picures nehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top