8

他のアプリケーションが使用できるように、アクティビティでビットマップを返したいです。

テキストを返すことは明らかです。

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>

編集:これが1つの関数の解決策です:

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");
    }
}
4

2 に答える 2

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がそれを行います。

于 2012-07-03T08:21:41.583 に答える
1

を使用してputExtra(key,byte[])を渡し、bytes次にBitmaponActivityResult使用BitmapFactory.decodeByteArray()して を作成できますBitmap

編集:Uriリソース/画像にan を返すこともできます。

于 2012-07-03T08:14:09.470 に答える