2012-07-03 18 views
7

Quiero devolver un mapa de bits en mi actividad, para que otras aplicaciones puedan usarlo.Actividad devolver una imagen

La devolución de un texto es clara.

Intent data = new Intent(); 
data.putExtra("text1", "text."); 
data.putExtra("text2", "longer text."); 
setResult(RESULT_OK, data); 

¿Pero cómo devolver un mapa de bits?

Más información: La actividad tiene varios propósitos para estar disponible para todos los que quieran obtener una imagen.

<intent-filter> 
    <action android:name="android.intent.action.GET_CONTENT" /> 
    <category android:name="android.intent.category.OPENABLE" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:mimeType="image/*" /> 
    <data android:mimeType="vnd.android.cursor.dir/image" /> 
</intent-filter> 
<intent-filter> 
    <action android:name="android.intent.action.PICK" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:mimeType="image/*" /> 
    <data android:mimeType="vnd.android.cursor.dir/image" /> 
</intent-filter> 

EDIT: Aquí está la solución en una función:

public void finish(Bitmap bitmap) { 
    try { 
     File folder = new File(Environment.getExternalStorageDirectory() + "/Icon Select/"); 
     if(!folder.exists()) { 
      folder.mkdirs(); 
     } 
     File nomediaFile = new File(folder, ".nomedia"); 
     if(!nomediaFile.exists()) { 
      nomediaFile.createNewFile(); 
     } 

     FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + "/Icon Select/latest.png"); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
     File bitmapFile = new File(Environment.getExternalStorageDirectory() + "/Icon Select/latest.png"); 

     if(bitmapFile.exists()) { 
      Intent localIntent = new Intent().setData(Uri.fromFile(bitmapFile)); 
      setResult(RESULT_OK, localIntent);     
     } else { 
      setResult(RESULT_CANCELED); 
     } 
     super.finish(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.d("beewhale", "Error writing data"); 
    } 
} 
+0

¿Qué estás tratando de lograr? Describirlo –

Respuesta

5

Aunque estoy de acuerdo con Ovidiu Latcu, puede tener problemas de memoria.

Puede ser mejor almacenar el mapa de bits en una ubicación temporal en la tarjeta SD. Y luego acceda desde allí. (Escribir y leer el mapa de bits en el archivo).

Alternativamente, si desea agregar una matriz de bytes como extra, primero comprima el mapa de bits en otro formato, p. Jpeg o similar, esto nuevamente reducirá los cambios en los problemas de memoria.

Una imagen simple de 8M píxeles, es de 32MB (4 capas). Y esto excede el uso de memoria permitido en la mayoría de los teléfonos (si no en todos) para una aplicación.

Almacenar directamente en el almacenamiento es la manera en que funciona la aplicación integrada de la cámara para evitar este problema.

Aquí está mi código para hacer frente a ella:

public void showCameraScreen(View view) { 
    // BUILT IN CAMERA 
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(this))); 
    this.startActivityForResult(camera, 1); 

} 

private File getTempFile(Context context) { 
    // it will return /sdcard/MyImage.tmp 
    final File path = new File(Environment.getExternalStorageDirectory(), context.getPackageName()); 
    if (!path.exists()) { 
     path.mkdir(); 
    } 
    return new File(path, "MyImage.tmp"); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1 && resultCode == RESULT_OK) { 
     final File file = getTempFile(this); 

     byte[] _data = new byte[(int) file.length()]; 
     try { 
      InputStream in = new FileInputStream(file); 
      in.read(_data); 
      in.close(); 
      in = null; 
      //DO WHAT YOU WANT WITH _data. The byte array of your image. 
     } catch (Exception E) { 

     } 
    } 
} 

Nota: También tendría que escribir código en su llamada intención, que almacena a la URI pasado - Aquí, el construido en el API de la cámara lo hace .

Cuestiones relacionadas