gpt4 book ai didi

android - 如何将字节数组数据发送到其他 Activity ?

转载 作者:行者123 更新时间:2023-11-29 23:14:23 25 4
gpt4 key购买 nike

我已经被这个问题困了好几天了。如果有任何有用的小评论可以拯救一名程序员......我有这两个 A 和 B Activity 。A Activity 是在startActivityForResult()中调用B Activity 的 Activity 。B Activity 是一个相机 Activity ,已将相机添加到 Activity 中。而B activity拍摄的照片需要传回给A activity。

我拍的照片是由PictureCallback通过byte[]数据接收的。这就是问题所在。我希望用户至少拍摄 2~3 张(或更多)照片,所以我试图让那些字节数组是 List 形式。

  1. Bitmap List 是不可能的,因为它在超过 40kb 时会导致 FAILED BINDER TRANSACTION 错误。

  2. ArrayList 不是Parcelable,所以不可能放入Intent Extra数据。

  3. 我试图通过 for 循环将照片的每个 byte [] 数据保存到 intent Extra。但是由于(我认为)容量问题,它会在 B Activity 完成时刷新应用程序。 (它不会被 logcat 捕获,因为它不会使应用程序崩溃)

我没有包含任何代码,因为认为不需要它。如果您对此感到好奇,我会立即向您展示您喜欢的任何代码。

如果有任何更好的方法,或者对我的试验的反馈很少,对我来说意义重大。真的很感激。感谢阅读!

一个 Activity

public class A_Activity extends AppCompatActivity{

private static final int CAMERA_REQUEST_CODE = 101;

private FrameLayout accidentFrame;
private FragmentManager manager;

......

ArrayList< byte[] > sending_list;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accident_record);


sending_list = new ArrayList<>();
....


// button that moves to B Activity
findViewById(R.id.btnCamera).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent cameraIntent = new Intent(A_Activity.this, B_Activity.class);

........

startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}
});

//

....

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

if (requestCode == CAMERA_REQUEST_CODE) {
if (resultCode == RESULT_OK) {

int size = data.getExtras().getInt("array_size");
for(int i = 0; i<size ; i++){
sending_list.add(data.getByteArrayExtra("byte_array" + i));
}

}
}
}



private void sendResult() {

// There is a reason using map!
HashMap<String, ArrayList<byte[]>> thisMap = new HashMap<>();

thisMap.put("0", sending_list);


Intent picturesData = new Intent();
picturesData.putExtra("data_map", thisMap);

startActivity(new Intent(A_Activity.this, C_Activity.class));
}

B_Activity(相机 Activity )

public class B_Activity extends AppCompatActivity{

....

Camera camera;
FrameLayout appCamera;

CameraSurfaceAdapter cameraAdapter;
Button btnCapture;
TextView btnFinish;


ArrayList<byte[]> byteArray;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accident_camera);


.....


appCamera = findViewById(R.id.appCamera);

if (camera == null) {

camera = Camera.open();
}


cameraAdapter = new CameraSurfaceAdapter(getApplicationContext(), camera);
appCamera.addView(cameraAdapter);


// take picture
byteArray = new ArrayList<byte[]>();
btnCapture = findViewById(R.id.btnCapture);
btnCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

takePicture();
}
});


btnFinish = findViewById(R.id.btnFinish);
btnFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if(byteArray != null){

Intent dataIntent = new Intent();
dataIntent.putExtra("array_size", byteArray.size());
for(int i = 0; i<byteArray.size() ; i++){

dataIntent.putExtra("byte_array" + i, byteArray.get(i));
}

setResult(RESULT_OK, dataIntent);
finish();

}
});
}


private void takePicture() {

if (camera != null) {

camera.takePicture(null, null, mPictureCallback);

} else {
}

}


Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {


byteArray.add(data);

camera.startPreview();

savePhoto(data);

}
};


.......


@Override
public void onBackPressed() {


btnFinish.performClick();

}


@Override
public void onDestroy() {
super.onDestroy();

camera.stopPreview();
camera.release();

camera = null;
}

最佳答案

不要传递图像。它效率低下,您很快就会达到大小限制。只需传递引用,就像您在 onActivityResult() 中从 Camera 收到的那样。或者,如果需要,将该图像文件存储在某处(SD 卡、私有(private)存储)并将 Uri 传递给它。不要传递二进制 blob。

关于android - 如何将字节数组数据发送到其他 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com