【问题标题】:ByteArray to a byte[] in a intentService?ByteArray 到 intentService 中的字节 []?
【发布时间】:2016-11-03 16:40:11
【问题描述】:

我已经广泛搜索了这个问题的答案,但我不知道该怎么做。

我正在尝试使用他们的教程 (https://firebase.google.com/docs/storage/android/upload-files) 将图片上传到 Firebase 进行存储。为此,我创建了一个 IntentService 来处理所有数据库调用。这就是我不足的地方。我从另一个这样的活动中打包我的照片;

public void sendToFB() {
    mImageView.setDrawingCacheEnabled(true);
    mImageView.buildDrawingCache();
    Bitmap bitmap = mImageView.getDrawingCache();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] data = baos.toByteArray();

    Bundle bundle = new Bundle();
    bundle.putByteArray("bitmap", data);

    Intent intent = new Intent(this, FirebaseService.class);
    intent.putExtra("picture", bundle);
    this.startService(intent);
}

然后我在服务中解包;

@Override
protected void onHandleIntent(Intent intent) {

    extras = (Bundle) intent.getExtras().get("picture");
    uploadPicToFirebase();
    ...

然后我尝试粘贴字节数组,但我需要将其转换为字节,我不知道如何在服务中。

private void uploadPicToFirebase() {

    // Get the data from an ImageView as bytes
    /*mImageView.setDrawingCacheEnabled(true);
    mImageView.buildDrawingCache();
    Bitmap bitmap = mImageView.getDrawingCache();
    */
    //Bundle extras = getIntent().getExtras();
    byte[] data = extras.getByteArray("picture");

    UploadTask uploadTask = mountainsRef.putBytes(data);
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            System.out.println("not ok");
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            System.out.println("helt ok");
            Uri downloadUrl = taskSnapshot.getDownloadUrl();
        }
    });
}

当然是以IllegalArgumentException结尾

java.lang.IllegalArgumentException:字节不能为空

【问题讨论】:

  • 我建议不要通过意图发送 byte[],而是保存一个临时文件,并将文件路径作为字符串传递给意图服务。 Intent extras 有一个很快就会达到的限制,尤其是在涉及作为字节数组的图像的情况下 - 阅读更多.. neotechsoftware.com/blog/android-intent-size-limit
  • 使用压缩的字节数组我会达到那个文件绑定器限制吗?
  • 取决于压缩字节[]的大小..在运行时你永远不会知道,因为每个图像都是不同的。我不可能知道未知输入大小的输出大小。我的建议不是答案,如下所示,它只是为了帮助解决您可能面临的潜在问题......现在最好先发制人,老实说,从编码的角度来看,这并不是什么大问题改变。我的经验法则是,尽可能只将最少数量的信息/数据/附加内容放在一个意图中,同时仍能达到相同的预期结果。

标签: java android arrays firebase firebase-storage


【解决方案1】:

你弄错了钥匙:

private void uploadPicToFirebase(){

    // ...

    byte[] data = extras.getByteArray("bitmap");

    // ...

}

【讨论】:

  • 该死的:/ 谢谢!
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 2013-01-06
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多