我有两个应用程序,即应用程序A和应用程序B.当我按下应用程序A中的按钮时,将调用应用程序B.在应用程序B中,它具有相机活动和一些其他图像处理选项,如裁剪,调整亮度和对比度。在图像处理之后,我需要将图像传递给App A.但是,图像不应该保存在SD卡中。
我尝试了什么:使用image to base64 string
第1步:我使用此代码调用了AppB
Intent i = new
Intent("com.appb.ImageProcessingActivity");
startActivityForResult(i, 100);
Step2:在App B中,在图像处理之后,我将图像转换为base64字符串并使用此代码将其发送回App A. (图像处理后,图像尺寸将<150kb)
Intent data = new Intent();
data.putExtra("outputImage", base64ImageString);
setResult(RESULT_OK, data);
finish();
第3步:在应用A中,我将使用此代码获取图像详细信息
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==100 && resultCode==RESULT_OK){
String outputImage = data.getStringExtra("base64ImageString");
byte[] decodedString = Base64.decode(outputImage, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
imageView.setImageBitmap(decodedByte);
}
}
但我无法从App A接收base64字符串形式App B.它显示以下错误(注意:我可以使用此方法发送普通字符串)
JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 1058260)
不接受此答案
在App B中,将图像保存在SD卡中并将图像路径发送到App B,然后将图像路径转换为App A中的base64,然后删除SD卡图像。
答案 0 :(得分:0)
首先,它们被称为活动而非#34;应用程序&#34;。
其次,你得到了这个错误,因为图像太大而无法在这样的活动之间传递。如果仔细查看logcat,您可能会在某处找到此错误&#34; TransactionTooLargeException &#34;。
要避免它并使您的应用程序更快地工作,您应该将图像保存为外部缓存目录中的文件,并将其路径传递给第二个活动,然后加载它。并且不要担心图像只会暂时保存,因为它位于缓存目录中。
答案 1 :(得分:0)
Bundle extras = new Bundle();
extras.putParcelable("Bitmap", bmp);
intent.putExtras(extras);
startActivity(intent);
发送申请 -
Button sendImage = (Button) findViewById(R.id.button2);
sendImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
SELECT_PICTURE);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
System.out.println("Image Path : " + selectedImagePath);
img.setImageURI(selectedImageUri);
sendImage(selectedImageUri);
}
}
}
void sendImage(Uri selectedImageUri) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, selectedImageUri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Send Image"));
}
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
收到申请
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearlyt = new LinearLayout(this);
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
TextView tv = new TextView(this);
linearlyt .addView(tv);
linearlyt .setOrientation(LinearLayout.VERTICAL);
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
tv.setText(intent.getExtras().getString(Intent.EXTRA_TEXT));
tv.append("\n" + (intent.getExtras().getString("MyKey")));
} else if (type.startsWith("image/")) {
if (bitmap != null) {
bitmap.recycle();
}
ImageView img = new ImageView(this);
Bundle bundle = intent.getExtras();
Uri uri = (Uri) bundle.get(Intent.EXTRA_STREAM);
img.setImageURI(uri);
linearlyt .addView(img);
}
} else {
// Handle other intents, such as being started from the home screen
}
setContentView(linearlyt);
}
答案 2 :(得分:0)
从Android 2时代开始,每个应用程序都有足够的RAM来存储一个摄像机图像,而不足以存储两个摄像机图像。我不认为这是可能的,但你可能会在清单中尝试android:largeHeap="true"
,但OTOH我认为它也不会起作用。
嗯,作为最后的手段,您可以创建一个服务(在您的一个应用程序中,可能在一个单独的进程中)并向该服务发送图像字节。但你确定这值得吗?问题是系统可能会决定杀死堆中有摄像头图像的两个应用程序之一。
或者,您可以创建一个ContentProvider并将图像存储在那里。 Google为我提供了Share an image with a content provider in Android app
等网页还有一个想法,真的很疯狂:将图像分割成可以通过Intent传递的大小的片段并将其传递给多个Intent:)
答案 3 :(得分:0)
试试这段代码:
在活动
中添加此行onActivityResult()@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
String str = data.getStringExtra("image");
filePath = Uri.parse(str);
}
使用getIntent()尝试在onActivityResult()中使用data.getStringExtra()
它可以帮助你