2012-07-03 6 views
7

私は自分のアクティビティでビットマップを返すので、他のアプリケーションでも使用できます。アクティビティ画像を返す

テキストを返すのははっきりしています。

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

しかし、どのようにビットマップを返すのですか?

詳細情報: このアクティビティには、画像を取得したいすべてのユーザーが利用できるようにいくつかのインテントがあります。

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

編集:ここでは は、一つの関数でのソリューションです:

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

達成しようとしていることは何ですか?説明してください –

答えて

5

私はOvidiu Latcuに同意しますが、メモリの問題が発生する可能性があります。

ビットマップをSDカードの一時的な場所に保存する方が良い場合があります。そしてそこからそれにアクセスしてください。 (ビットマップの書き込みと読み取り)。

また、バイト配列を余分に配置する場合は、まずビットマップを別の形式に圧縮します(例: Jpegまたは同様の、これは再びメモリの問題の変更を削減します。

単純な8Mピクセルイメージは、32MB(4層)です。これは、アプリケーションのほとんどの電話(すべてではないにしても)で許容されるメモリ使用量を超えています。

この問題を回避するには、内蔵のカメラアプリがどのように機能するかがストレージに直接保存されています。ここで

はそれに対処するための私のコードです:

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

     } 
    } 
} 

注:また、渡されたURIに保存することを、あなたと呼ばれる意図にコードを記述する必要があります - ここでは、カメラのAPIで構築することはそれをしません。

0

あなたはputExtra(key,byte[])を使用し、Bitmapbytesを通過した後、あなたのonActivityResult使用BitmapFactory.decodeByteArray()Bitmapを作成することができます。

EDIT:また、リソース/画像にUriを返すこともできます。

関連する問題