2012-07-03 42 views
7

Tôi muốn trả về một bitmap trong hoạt động của mình, vì vậy các ứng dụng khác có thể sử dụng nó.Hoạt động trả về một hình ảnh

Trả lại văn bản sẽ rõ ràng.

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

Nhưng cách trả về bitmap?

Thông tin khác: Hoạt động có một vài ý định khả dụng cho tất cả những ai muốn có hình ảnh.

<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: Dưới đây là giải pháp trong một chức năng:

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

Bạn đang cố gắng đạt được điều gì? Miêu tả nó –

Trả lời

5

Trong khi tôi đồng ý với Ovidiu Latcu, bạn có thể gặp sự cố về bộ nhớ.

Có thể tốt hơn để lưu Bitmap vào vị trí tạm thời trên thẻ SD. Và sau đó truy cập nó từ đó. (Viết và đọc bitmap vào tập tin).

Hoặc, nếu bạn muốn đi với việc đặt một mảng byte làm thêm, hãy nén bitmap sang định dạng khác trước, ví dụ: Jpeg hoặc tương tự, điều này một lần nữa sẽ làm giảm những thay đổi của các vấn đề bộ nhớ.

Một hình ảnh 8M pixel đơn giản, là 32MB (4 lớp). Và điều này vượt quá mức sử dụng bộ nhớ cho phép trên hầu hết các điện thoại (nếu không phải tất cả) cho một ứng dụng.

Lưu trữ thẳng vào Bộ nhớ là cách ứng dụng máy ảnh tích hợp hoạt động để tránh sự cố này.

Đây là mã của tôi để đối phó với nó:

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

     } 
    } 
} 

Lưu ý: Bạn cũng sẽ cần phải viết mã trên được gọi là ý định của bạn, mà các cửa hàng với Uri qua - Ở đây, việc xây dựng trong máy ảnh api làm nó .

0

Bạn có thể sử dụng putExtra(key,byte[]) và vượt qua bytes của Bitmap của bạn và sau đó trong onActivityResult bạn sử dụng BitmapFactory.decodeByteArray() để tạo ra các Bitmap.

CHỈNH SỬA: Bạn cũng có thể trả lại Uri cho tài nguyên/hình ảnh của mình.

Các vấn đề liên quan