2017-02-10 2 views
1

Grundsätzlich versuche ich eine einfache App zu erstellen, die die Standardkamera-App verwendet, um ein Bild aufzunehmen, und dann dieses Bild in einer neuen Aktivität in einem ImageView anzeigenDas Ergebnis der Kameraaktivität in ImageView kann nicht angezeigt werden.

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

und ich bin auch manuell anfordernden: ich, aber alles versucht haben, hat sich in

java.io.FileNotFoundException: /storage/emulated/0/imageToProcess.jpg: open failed: ENOENT (No such file or directory)

ich habe die richtigen Berechtigungen (vielleicht sogar zu viele) im Manifest enthalten resultierten Berechtigungen wenn nötig in t er Haupttätigkeit:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if(checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.CAMERA}, 1); 
    } 
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
    } 
    if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 
    } 
} 

so glaube ich nicht, dass das Problem mit Lese-/Schreibberechtigungen ist.

In meiner Haupt-XML-Datei Aktivität, ich habe eine Schaltfläche mit einem onClick Hörer erstellt, das die folgenden Methode aufruft:

public void openCamera(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "imageToProcess.jpg"); 
    imgUri = Uri.fromFile(f); 
    intent.putExtra("imgUri", imgUri.toString()); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

Hier ist die onActivityResult() -Methode ich eine neue Absicht zu schaffen definiert und übergibt die uri auf die neue Tätigkeit:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if(requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK) { 
     Intent camResult = new Intent(this, ShowCameraResult.class); 
     camResult.putExtra("imgUri", imgUri.toString()); 
     startActivity(camResult); 
    } 
} 

HINWEIS: imgUri und TAKE_PICTURE sind an der Spitze der Klasse definiert als protected static final int TAKE_PICTURE = 1; und private Uri imgUri;

Schließlich ist hier meine ShowCameraResult Aktivität

public class ShowCameraResult extends AppCompatActivity { 
    private Bitmap mImageBitmap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_show_camera_result); 
     ImageView imageView = (ImageView)findViewById(R.id.imageView); 
     String filePath = getIntent().getStringExtra("imgUri"); 
     Log.d("ShowCameraResult", "directory: " + filePath); 
     try { 
      mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(filePath)); 
      imageView.setImageBitmap(mImageBitmap); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Der Log.d Methodenaufruf oben zurück

ShowCameraResult: directory: file:///storage/emulated/0/imageToProcess.jpg 

Dies führt mich zu glauben, dass das Bilder von der Kamera nicht tatsächlich in gespeichert wird meine imageToProcess.jpg Datei, aber ich könnte sehr falsch liegen, da dies das erste echte Android-Projekt ist, an dem ich gearbeitet habe.

Also meine Frage ist: Wo bin ich falsch gelaufen?

Jede Hilfe wird sehr geschätzt, danke!

+0

Test es auf dem Gerät nicht auf Emulator –

+0

@Dhara Ich teste auf einem Galaxy S5 – Austin

+0

sein ein Fehler in Samsung-Test auf andere Gerät –

Antwort

0

ITs, die eine Datei zurückgeben, keine Inhaltsauflösung URI. Entschlüsseln Sie die Datei einfach mit BitmapFactory.

+0

Es gibt den URI einer Datei zurück. Verwenden Sie BitmapFactory.decodeFile, um die Bitmap für die Datei abzurufen. Dann zeige das an. Es sind keine Inhaltsresolver erforderlich, es wird keine UR zurückgegeben. Es speichert die Datei genau dort, wo Sie es in Ihrer Absicht gefragt haben. –

+0

Oh und Randnotiz- Sie brauchen keine Kameraerlaubnis um die Kamera zu starten. Nur wenn Sie vorhaben, das Bild in Ihrer App aufzunehmen. –

0
private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      startActivityForResult(takePictureIntent, TAKE_PICTURE); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.d(TAG, "onActivityResult: "+data); 
     if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      Bitmap imageBitmap = (Bitmap) extras.get("data"); 
      Log.d(TAG, "onActivityResult: "+imageBitmap); 
      imageView.setImageBitmap(imageBitmap); 
     } 
    } 

SenderActivity:

Intent _intent = new Intent(this, newscreen.class); 
Bitmap _bitmap; // your bitmap 
ByteArrayOutputStream _bs = new ByteArrayOutputStream(); 
_bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs); 
i.putExtra("byteArray", _bs.toByteArray()); 
startActivity(i); 

ReciverActivity

if(getIntent().hasExtra("byteArray")) { 
ImageView _imv= new ImageView(this); 
Bitmap _bitmap = BitmapFactory.decodeByteArray(
     getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);   
_imv.setImageBitmap(_bitmap); 
} 
Verwandte Themen