将bitmab从活动传递回片段

时间:2020-06-18 06:54:42

标签: java android

我有一个片段,其中包含一个图像视图和一个按钮,当我单击该按钮转到具有以位图作为图像的活动时,在该活动中,我有一个按钮(保存)应完成该活动并回到带有位图数据的片段。

我尝试使用意图和捆绑包,但没有任何效果。

3 个答案:

答案 0 :(得分:0)

您需要将Bitmap数据转换为byte数组,然后将其放入Bundle

ByteArrayOutputStream mStream = new ByteArrayOutputStream();
yourBitmapImage.compress(Bitmap.CompressFormat.PNG, 100, mStream);
byte[] byteArray = mStream.toByteArray();

Bundle mBundle = new Bundle();
mBundle.putByteArray("image",byteArray);

答案 1 :(得分:0)

通过bundle意图传递位图对象非常危险,特别是对于长度未知的位图,您可能最终会遇到错误,因为Parcelable extra的大小甚至受到限制。它是极不推荐的。更好的解决方案是保存它到文件,然后是String值的路径,并将其传递到下一个活动甚至共享优先级,以防万一即使应用程序关闭后甚至在代码中的其他位置也可能需要它而又不占用内存的情况。如果处理不当,将对内存造成巨大威胁。请参阅

public class Bitmap_saver{


public static String my_bitmap_path(Context act) {

    SharedPreferences prefs = act.getSharedPreferences("SHAREDpREFname", act.MODE_PRIVATE);
    return prefs.getString("my_bitmap_address", null);

}

public static void set_my_bitmap_address(Context act, String path) {

    SharedPreferences.Editor saver = act.getSharedPreferences("SHAREDpREFname", act.MODE_PRIVATE).edit();

    saver.putString("my_bitmap_address", path);
    saver.commit();

}
public static String save_to_file(Bitmap fpb)
{
    String img_name="BIT_"+ System.currentTimeMillis()+".JPG";

    OutputStream fOutputStream = null;

    File file = new File( Environment.getExternalStorageDirectory().toString() + "/YOUR_APP_DATA/");
    if (!file.exists()) {
        Log.e("Creating data dir=>",""+ String.valueOf(file.mkdirs()));
    }

    file = new File(Environment.getExternalStorageDirectory().toString() + "/YOUR_APP_DATA/", img_name);

    try {
        fOutputStream = new FileOutputStream(file);

        fpb.compress(Bitmap.CompressFormat.JPEG, 100, fOutputStream);

        fOutputStream.flush();
        fOutputStream.close();


    } catch (FileNotFoundException e) {
        e.printStackTrace();

         return "error";
    } catch (IOException e) {
        e.printStackTrace();

        //   Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show();
        return "error";
    }
    return file.getAbsolutePath();
}

}

像这样调用以保存Bitmap_saver.set_my_bitmap_path(your_context,Bitmap_saver.save_to_file(your_bitmap));

从您的检索片段/活动/类中将其称为Bitmap myBitmap = BitmapFactory.decodeFile(Bitmap_saver.my_bitmap_path(your_context));

答案 2 :(得分:0)

我最终使用这种方法:

  1. 在您的片段中:

     Intent signatureIntent = new Intent(getActivity(), SignatureActivity.class);
     startActivityForResult(signatureIntent, your_request_code);
    
     @Override
     public void onActivityResult(int requestCode, int resultCode,
                                  @Nullable Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
         if(requestCode == your_request_code&& resultCode == Activity.RESULT_OK){
    
             String received = data.getStringExtra("extra");
             byte[] decodedString = Base64.decode(received, Base64.DEFAULT);
             Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, 
             decodedString.length);
        }
    }
    
  2. 您的活动中

     bitmap = signatureView.getSignatureBitmap();
     Intent resultIntent = new Intent();
    
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
      byte[] byteArray = byteArrayOutputStream.toByteArray();
      String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
    
      resultIntent .putExtra("extra",encoded);
      setResult(Activity.RESULT_OK, resultIntent);
      finish();