2016-07-08 4 views
1

J'essaie de faire une application où l'utilisateur peut prendre une photo et cette image est stockée dans une imageview. J'ai essayé des dizaines de méthodes pour que cela fonctionne.Android: Comment prendre une photo avec l'appareil photo et stocker l'image en pleine résolution dans imagview?

Beaucoup de réponses que j'ai vues suggèrent d'utiliser data.getExtra ("data") en utilisant l'intention de MediaStore et en passant dans ACTION_CAMERA_CAPTURE. Cela renvoie une image plus petite et l'image que j'essaie d'afficher est grande, donc l'image apparaît floue en utilisant cette méthode.

L'autre option consiste à utiliser cette même méthode et à passer dans EXTRA_OUTPUT. Cependant, cela nécessite de mettre dans l'emplacement de stockage et chaque réponse que j'ai vu me dit de mettre dans Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES). Cependant quand j'essaye de faire data.getData() dans onActivityResult j'obtiens null. Comment puis-je faire cela? méthode

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

    } 
} 

Répondre

0

Je suppose que le Environment.getExternalSt ...() est d'obtenir un emplacement de stockage qui n'existe pas.

Probablement pas. Toutefois, vous supposez que votre valeur EXTRA_OUTPUT vous est renvoyée par l'application Appareil photo. Il n'y a rien dans la documentation ACTION_IMAGE_CAPTURE qui suggère que cela se produit.

Je ne sais pas quel est l'emplacement de stockage correct et je n'ai pas réussi à le trouver.

Vous savez où l'image est censée être. Il est censé être à l'emplacement que vous avez fourni dans EXTRA_OUTPUT. Alors, allez y voir pour voir si l'image est là. Cependant, assurez-vous que vous mettez profileImage dans l'état d'instance enregistré Bundle, car il n'y a aucune garantie que votre processus reste actif tant que l'application de la caméra est au premier plan. En outre, gardez à l'esprit qu'il existe de nombreuses mises en œuvre buggy ACTION_IMAGE_CAPTURE, donc il n'y a aucune garantie que l'image sera là où vous avez demandé, mais il devrait être.

Par exemple, voici une activité qui utilise ACTION_IMAGE_CAPTURE pour prendre une photo en pleine résolution, puis utilise ACTION_VIEW pour avoir une visionneuse d'images afficher le résultat:

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

(de this sample app)

Plus le long terme, ce n'est pas une bonne solution, comme fileUri values are going away. Le official training page et this revamped edition of my sample app, montrent en utilisant FileProvider à la place.

+0

Que voulez-vous dire que le EXTRA_OUTPUT n'est pas retourné? Comment puis-je obtenir les données d'intention si cela ne va pas? En outre, j'ai cherché l'emplacement de stockage sur mon téléphone, mais je n'ai pas pu le trouver. Je l'ai trouvé en regardant mon stockage de téléphone sur mon ordinateur. C'est l'emplacement [link] (http://i.imgur.com/MgAYa9U.png) (ne sait pas si ça aide). Savez-vous comment je pourrais l'obtenir pour stocker dans l'emplacement de la galerie à la place? [link] (http://i.imgur.com/GhdIWB8.png) – kindOfABigDeal

+0

En fait, le dossier qu'il essaye d'obtenir est faux. Cela me donne cet emplacement/storage/emulated/0/Pictures/qui n'existe pas. Cela devrait me donner un répertoire de photos dans la dernière image. – kindOfABigDeal

+0

@kindOfABigDeal: "Que voulez-vous dire que EXTRA_OUTPUT n'est pas retourné?" - Je veux dire que vous devez garder la valeur que vous mettez dans EXTRA_OUTPUT. Cette valeur ne vous revient pas dans le résultat "Intent"."En fait, le dossier qu'il essaie d'obtenir est faux" - très probablement, c'est un emplacement correct pour [stockage externe] (https://commonsware.com/blog/2014/04/08/storage-situation-external- storage.html). – CommonsWare