2010-04-23 8 views
8

Hombre, soy todavía no puedo guardar una imagen cuando envío un intento pidiendo que se tome una foto. Esto es lo que estoy haciendo:Problemas al guardar una foto en un archivo

  1. Hacer un URI que representa el nombre de ruta

    android.content.Context c = getApplicationContext(); 
    
    String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 
    
    java.io.File file = new java.io.File(fname); 
    
    Uri fileUri = Uri.fromFile(file); 
    
  2. Cree la Intención (! No se olvide el nombre de paquete) y comenzar la actividad

    private static int TAKE_PICTURE = 22; 
    
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    
    intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(intent, TAKE_PICTURE); 
    
  3. Se inicia la actividad de la cámara y puedo tomar una fotografía y aprobarla. Mi onActivityResult() luego se llama. Pero mi archivo no se escribe. El URI es: file: ///data/data/com.droidstogo.boom1/files/parked.jpg

  4. puedo crear OK miniatura (por no poner el extra en la Intención), y se puede escribir que archive OK, y luego léalo nuevamente).

¿Alguien puede ver qué simple error estoy cometiendo? Nada obvio aparece en el logcat: la cámara claramente está tomando la fotografía. Gracias,

Peter


Debo mencionar que tengo los permisos apropiados en el archivo AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_OWNER_DATA" /> 
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" /> 

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

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-library android:name="com.google.android.maps" /> 



</application> 

alguna idea? ¿Alguna idea sobre qué hacer para obtener más información sobre el problema?

+0

¿puede por favor poner un código para una mejor comprensión del problema – the100rabh

+0

Quizás esta [pregunta] (http://stackoverflow.com/questions/649057/how-do-i-save-data-from-camera-to- disk-using-mediastore-on-android) puede ayudar. – kgiannakakis

Respuesta

1

¿Es porque usted ha agregado un punto extra:

intent.putExtra("com.droidstogo.boom1." 

En lugar de:.

intent.putExtra("com.droidstogo.boom1" 
1

Su problema puede estar en el directorio que está tratando de almacenar el archivo en Para guarde los archivos en la tarjeta SD, no necesita ningún permiso especial, pero la forma en que obtiene la referencia de la carpeta es diferente de cómo lo hizo. También depende de si desea guardar la imagen de forma que la MediaStore pueda recuperarla (es decir, cosas como la aplicación de galería o álbumes, o cualquier otra aplicación que dependa de esas para buscar imágenes) o no. Suponiendo que se desea que se enumeran en la MediaStore, aquí está el código para hacer eso:

ContentValues newImage = new ContentValues(2); 
newImage.put(Media.DISPLAY_NAME, "whatever name you want shown"); 
newImage.put(Media.MIME_TYPE, "image/png"); 

Uri uri = contentResolver.insert(Media.EXTERNAL_CONTENT_URI, newImage); 

try { 
    Bitmap bitmap = //get your bitmap from the Camera, however that's done 
    OutputStream out = contentResolver.openOutputStream(uri); 
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
    out.close(); 
    if (success){ 
     Log.d("Image Writer", "Image written successfully.");     
    } else { 
     Log.d("Image Writer", "Image write failed, but without an explanation."); 
    } 

} catch (Exception e){ 
    Log.d("Image Writer", "Problem with the image. Stacktrace: ", e); 
} 

En mi emulador v1.5 corriendo, eso ahorra con éxito un mapa de bits en la tarjeta SD en la carpeta/cámara DCIM con su el nombre del archivo es la hora actual. (El tiempo se guarda en milisegundos desde el 1 Ene 1970 también conocida como la "Época" por alguna razón.)

+0

Solo para resaltar ... para guardar archivos en la tarjeta SD, DEBE tener permisos. Creo que esto se modificó en el nivel 4 de la API. –

+0

@fiXedd: solo para mostrar a cambio: P Resulta que tienes razón en que introdujeron el requisito de tener permiso para escribir en la tarjeta SD. En v1.5, funcionó bien sin, pero en v2.1 requirió el permiso. Sin embargo, para escribir en Media Store, tanto en 2.1 como en 1.5, no parecía necesario ningún permiso. –

7
  1. Como Steve H dijo que no sólo puede utilizar file: /// datos/datos/com.droidstogo.boom1/files/parked.jpg para eso. Es el directorio privado de su aplicación y la cámara no puede escribir allí. Puede usar algún archivo de tarjeta SD, por ejemplo, está disponible para todos.

  2. Como Stealthcopter dijo, la intención adicional es simplemente MediaStore.EXTRA_OUTPUT sin el nombre de su paquete.

  3. No es un problema solo para FYI. Supongo que ninguno de los permisos que especificó se requieren realmente para esta operación.

Aquí está mi ejemplo de código:

final int REQUEST_FROM_CAMERA=1; 

private File getTempFile() 
{ 
    //it will return /sdcard/image.tmp 
    return new File(Environment.getExternalStorageDirectory(), "image.tmp"); 
} 

private void getPhotoClick() 
{ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile())); 
    startActivityForResult(intent, REQUEST_FROM_CAMERA); 
} 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) { 
    InputStream is=null; 

    File file=getTempFile(); 
    try { 
     is=new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    //On HTC Hero the requested file will not be created. Because HTC Hero has custom camera 
    //app implementation and it works another way. It doesn't write to a file but instead 
    //it writes to media gallery and returns uri in intent. More info can be found here: 
    //http://stackoverflow.com/questions/1910608/android-actionimagecapture-intent 
    //http://code.google.com/p/android/issues/detail?id=1480 
    //So here's the workaround: 
    if(is==null){ 
     try { 
      Uri u = data.getData(); 
      is=getContentResolver().openInputStream(u); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Now "is" stream contains the required photo, you can process it 
    DoSomeProcessing(is); 

    //don't forget to remove the temp file when it's not required. 
    } 

} 
0

Como dijo Steve, debe guardar la imagen en la tarjeta SD. El directorio donde intentas guardar es privado y, a menos que hayas rooteado tu dispositivo, no podrás escribir allí. Intenta reemplazar esta línea:

String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 

con esta línea

String fname = Environment.getExternalStorageDirectory().getAbsolutePath() + "somePathYouKnownExists" + +"/parked.jpg"; 

Esto debería ser suficiente.

Cuestiones relacionadas