我通过谷歌甚至YouTube搜索视频。代码在上传和显示大图像时效果很好,但在将其发送到下一个活动时会崩溃。我尝试过质量或尺寸较小的图像,效果很好
fprintf(out_file, "%s %d %d %d", header.MAGIC_NUMBER,header.HEIGHT,header.WIDTH,header.MAX_COLOR);
这是显示从 MainActivity.java 发送的图像的位置:
let ref = firebase.database().ref('players').child(playerId).child('voters');
ref.child(uid).once('value', snap => {
if (snap.exists) {
// a vote has already been recorded
} else {
// there is not already a vote there
}
});
以下是错误消息:
public class MainActivity extends AppCompatActivity {
private static final int PICK_IMAGE_REQUEST = 123;
public static Bitmap bitmap;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.img);
}
public void upload(View view) {
Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK)
switch (requestCode) {
case PICK_IMAGE_REQUEST:
Uri filePath = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
Log.i("TAG", "Some exception" + e);
}
break;
}
}
public void Submit(View view) {
Intent intent = new Intent(getApplicationContext(), Main2Activity.class);
if(bitmap !=null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, stream);
byte[] byteArray = stream.toByteArray();
intent.putExtra("bitmap", byteArray);
}
startActivity(intent);
}
}
答案 0 :(得分:1)
您无法通过documentation
中的意图发送大图片通过意图发送数据时,应该小心限制 数据大小为几KB。发送太多数据可能会导致系统崩溃 抛出TransactionTooLargeException异常。
所以,如果你发送 Uri 并在接收器Activity中处理Uri会更好。
首先,您需要在第一个活动中发送Uri而不是Bitmap:
private Uri mFileUri;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK)
switch (requestCode) {
case PICK_IMAGE_REQUEST:
// Save uri for submit process.
mFileUri = data.getData();
...
break;
}
}
public void Submit(View view) {
Intent intent = new Intent(this, Main2Activity.class);
intent.setData(mFileUri);
startActivity(intent);
}
然后在接收器活动中处理它:
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
ImageView img = (ImageView) findViewById(R.id.imgg);
// get the fileUri from the intent
Uri fileUri = getIntent().getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
img.setImageBitmap(bitmap);
} catch (IndexOutOfBoundsException e){
// handle the exception.
}
}
}
答案 1 :(得分:0)
答案很简单。将映像存储在设备文件存储中,将存储中映像的Uri传递给正在启动另一个活动的Intent,然后从该intent获取Uri,并从该文件加载。
答案 2 :(得分:0)
Bitmap
中的MainActivity
对象被标记为静态,我怀疑为什么这是必要的
将其设置为静态会使Android在启动Main2Activity时无法使用GC
你内存不足的一个潜在原因。
尝试将其更改为private Bitmap bitmap
。 可能解决您的问题。
但通常在活动上传递位图对象很少见
由于您提到图片已上传,因此在上传图片后,最好从服务器获取图片网址,然后使用某些图片库(例如Glide
或Fresco
)从互联网。
答案 3 :(得分:0)
此:
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
这条线很难耗尽内存。现在你有图像的URI吗?
Uri filePath = data.getData();
现在使用Picasso加载如下图像 1.如果您想将图像发送到其他地方:
com.squareup.picasso.Target mTarget = new com.squareup.picasso.Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
imageView.setImageBitmap(bitmap);
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(mContext).load(filePath).into(mTarget);
Picasso.with(mContext).load(filePath).centerInside().resize(YourWidth,YourHeight).into(imageview);