2016-07-08 4 views
1

Ich versuche, eine App zu machen, wo der Benutzer ein Bild machen kann und das Bild in einer Bildansicht gespeichert wird. Ich habe Dutzende von Methoden ausprobiert, um dies zum Laufen zu bringen.Android: Wie nehme ich ein Bild mit der Kamera und speichere das Bild mit voller Auflösung in imagview?

Viele Antworten, die ich gesehen habe, schlagen vor, data.getExtra ("data") mit dem MediaStore Intent zu verwenden und ACTION_CAMERA_CAPTURE zu übergeben. Dadurch wird ein kleineres Bild zurückgegeben, und das Bild, das ich anzeigen möchte, ist groß, sodass das Bild bei dieser Methode unscharf wird.

Die andere Option besteht darin, dieselbe Methode zu verwenden und EXTRA_OUTPUT zu übergeben. Dies erfordert jedoch das Einlagern des Speicherorts und jede Antwort, die ich gesehen habe, sagt mir, dass ich in Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES) einfügen soll. Wenn ich versuche, data.getData() in onActivityResult zu machen, bekomme ich null. Wie mache ich das?

alert.setPositiveButton("Take Photo", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     profileFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "image_" + 
           String.valueOf(System.currentTimeMillis()) + ".jpg"); 

     profile = Uri.fromFile(profileFile); 
         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         intent.putExtra(MediaStore.EXTRA_OUTPUT, profile); 


     startActivityForResult(intent, 1); 
    } 
}); 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 1 && resultCode == RESULT_OK) { 

     ImageView imageView = (ImageView) findViewById(R.id.ProfileImage); 

     //This returns null. 
     //I am guessing that the Environment.getExternalSt...() method is getting a storage 
     //location that does not exist. 
     //I don't know what the correct storage location is and I have not 
     //been able to find it. 
     Uri u = data.getData(); 

     File finalFile = new File(getRealPathFromURI(u)); 

     Picasso.with(this).load(finalFile).into(imageView); 

    } 
} 

Antwort

0

Ich vermute, dass die Environment.getExternalSt ...() -Methode einen Speicherort bekommen, das nicht existiert.

Wahrscheinlich nicht. Sie gehen jedoch davon aus, dass der Wert EXTRA_OUTPUT Ihnen von der Kamera-App zurückgegeben wird. Es gibt nichts in der ACTION_IMAGE_CAPTURE Dokumentation, die vorschlagen würde, dass dies auftritt.

Ich weiß nicht, was der richtige Speicherort ist, und ich konnte es nicht finden.

Sie wissen, wo das Bild sein soll. Es soll an dem Ort sein, den Sie in EXTRA_OUTPUT geliefert haben. Also schau dort hin, ob das Bild da ist. Stellen Sie jedoch sicher, dass Sie profileImage im gespeicherten Instanzstatus Bundle setzen, da es keine Garantie dafür gibt, dass Ihr Prozess weiterläuft, während die Kameraanwendung im Vordergrund ist. Bedenken Sie auch, dass es viele fehlerhafte ACTION_IMAGE_CAPTURE Implementierungen gibt, daher gibt es keine Garantie dafür, dass das Bild an der von Ihnen gewünschten Stelle angezeigt wird, obwohl dies der Fall sein sollte.

Zum Beispiel, hier eine Tätigkeit, die ACTION_IMAGE_CAPTURE verwendet ein volle Auflösung Bild zu machen, verwendet dann ACTION_VIEW einige Bildbetrachter das Ergebnis anzeigen haben:

/*** 
Copyright (c) 2008-2016 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import java.io.File; 

public class CameraContentDemoActivity extends Activity { 
    private static final String EXTRA_FILENAME= 
    "com.commonsware.android.camcon.EXTRA_FILENAME"; 
    private static final String FILENAME="CameraContentDemo.jpeg"; 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (savedInstanceState==null) { 
     File dir= 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

     dir.mkdirs(); 
     output=new File(dir, FILENAME); 
    } 
    else { 
     output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); 
    } 

    if (output.exists()) { 
     output.delete(); 
    } 

    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putSerializable(EXTRA_FILENAME, output); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 

(von this sample app)

Over Auf lange Sicht ist das keine gute Lösung, wie fileUri values are going away. Die official training page und this revamped edition of my sample app zeigen stattdessen FileProvider.

+0

Was meinst du mit EXTRA_OUTPUT wird nicht zurückgegeben? Wie bekomme ich die Absichtsdaten, wenn dies falsch ist? Auch suchte ich nach dem Speicherort auf meinem Telefon, konnte es aber nicht finden. Ich habe es gefunden, indem ich meinen Telefonspeicher auf meinem Computer angesehen habe. Dies ist der Ort [link] (http://i.imgur.com/MgAYa9U.png) (weiß nicht, ob es hilft). Weißt du, wie ich es stattdessen im Galeriestandort ablegen könnte? [link] (http://i.imgur.com/GhdIWB8.png) – kindOfABigDeal

+0

Eigentlich ist der Ordner, den es zu bekommen versucht, falsch. Es gibt mir diesen Speicherort/Speicher/emuliert/0/Bilder/die nicht existiert. Es sollte mir Bilderverzeichnis im letzten Bild geben. – kindOfABigDeal

+0

@kindOfABigDeal: "Was meinst du mit EXTRA_OUTPUT wird nicht zurückgegeben?" - Ich meine, dass Sie den Wert behalten müssen, den Sie in "EXTRA_OUTPUT" eingegeben haben. Dieser Wert kommt im Ergebnis "Absicht" nicht zu dir zurück."Tatsächlich ist der Ordner, den es zu bekommen versucht, falsch" - das ist wahrscheinlich der richtige Ort für [externen Speicher] (https://commonsware.com/blog/2014/04/08/storage-situation-external-) storage.html). – CommonsWare