【问题标题】:Upload Image after Capture - Android拍摄后上传图片 - Android
【发布时间】:2018-05-28 15:22:13
【问题描述】:

我要做的是捕获图像并在图像视图中查看它并将其存储到 Firebase 存储中。

我的代码:

public class WaterConsumptionPage extends Fragment {

private ImageView imageView;
private Button capture, upload;
static final int CAM_REQUEST = 1;
private StorageReference mStorageRef;
private FirebaseAuth mAuth;
private DatabaseReference dbRef;
private ProgressDialog mProgress;
private Bitmap photo;
private FirebaseUser user;
private Uri uri;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.water_consumption_page, container, false);

    mStorageRef = FirebaseStorage.getInstance().getReference();
    mAuth = FirebaseAuth.getInstance();
    dbRef = FirebaseDatabase.getInstance().getReference();
    user = mAuth.getCurrentUser();

    imageView = rootView.findViewById(R.id.water_image);
    capture = rootView.findViewById(R.id.water_capture);
    upload = rootView.findViewById(R.id.water_upload);

    upload.setEnabled(false);

    capture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent cam_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(cam_intent.resolveActivity(getActivity().getPackageManager()) != null){
                startActivityForResult(cam_intent, CAM_REQUEST);
            }
        }
    });

    mProgress = new ProgressDialog(getContext());
    upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mProgress.setMessage("Uploading Image...");
            mProgress.show();

            StorageReference filepath = mStorageRef.child("Photos").child(user.getUid()).child("Water").child(uri.getLastPathSegment());
            filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    mProgress.dismiss();
                    Toast.makeText(getContext(), "Upload Finished...", Toast.LENGTH_LONG).show();
                    Intent i = new Intent(getContext(), WaterConsumption.class);
                    startActivity(i);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    mProgress.dismiss();
                    Toast.makeText(getContext(), "Upload has stopped.", Toast.LENGTH_LONG).show();
                }
            });
        }
    });

    return rootView;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == CAM_REQUEST && data != null){
        upload.setEnabled(true);
        uri = data.getData();
        Bundle extras = data.getExtras();
        photo = (Bitmap) extras.get("data");
        imageView.setImageBitmap(photo);

    }
}

错误:

E/AndroidRuntime: 致命异常: main 进程:com.example.akoni.conread,PID:13901 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.net.Uri.getLastPathSegment()” 在 com.example.akoni.conread.WaterConsumptionPage$2.onClick(WaterConsumptionPage.java:87) 在 android.view.View.performClick(View.java:5265) 在 android.view.View$PerformClick.run(View.java:21534) 在 android.os.Handler.handleCallback(Handler.java:815) 在 android.os.Handler.dispatchMessage(Handler.java:104) 在 android.os.Looper.loop(Looper.java:207) 在 android.app.ActivityThread.main(ActivityThread.java:5728) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

我也尝试将此代码放入 onActivityResult() 中以测试是否可以保存图像,但我仍然遇到另一个错误(如下)。

StorageReference filepath = mStorageRef.child("Photos").child(user.getUid()).child("Water").child(uri.getLastPathSegment());
filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
               mProgress.dismiss();
               Toast.makeText(getContext(), "Upload Finished...", Toast.LENGTH_LONG).show();
               Intent i = new Intent(getContext(), WaterConsumption.class);
                    startActivity(i);
                }
        }).addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                  mProgress.dismiss();
                  Toast.makeText(getContext(), "Upload has stopped.", Toast.LENGTH_LONG).show();
              }
});

错误:

E/AndroidRuntime: 致命异常: main 进程:com.example.akoni.conread,PID:14526 java.lang.RuntimeException:将结果 ResultInfo{who=null, request=65537, result=-1, data=Intent { act=inline-data (has extras) }} 传递给活动 {com.example.akoni.conread/ 失败com.example.akoni.conread.TabMenu}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.net.Uri.getLastPathSegment()' 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3929) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3972) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:207) 在 android.app.ActivityThread.main(ActivityThread.java:5728) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.net.Uri.getLastPathSegment()” 在 com.example.akoni.conread.WaterConsumptionPage.onActivityResult(WaterConsumptionPage.java:120) 在 android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:151) 在 android.app.Activity.dispatchActivityResult(Activity.java:6502) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3925) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3972) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:207) 在 android.app.ActivityThread.main(ActivityThread.java:5728) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

我想捕获图像并首先将其查看到 ImageView,然后单击 upload 将图像保存到 firebase。

【问题讨论】:

  • 您应该一次解决一个问题,而不是从同一代码中转储大量错误。删除与 Firebase 存储相关的代码,并确保您首先设法保存照片(如果要上传完整图像)。你有一个关于如何处理这个的官方教程developer.android.com/training/camera/photobasics.html。在您设法解决此部分后,编辑您的问题并添加更新的代码,然后添加 Firebase 代码以及您在上传时遇到的任何问题。

标签: java android android-studio image-uploading firebase-storage


【解决方案1】:

你应该删除这行代码:

super.onActivityResult(requestCode, resultCode, data);

因为我认为这一行会导致 data.getIntent() 什么也不返回。

如果没问题,您还应该检查resultCode。 这是一个例子:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAM_REQUEST && resultCode == RESULT_OK) {
       Uri uri = data.getData();
    } 
  }

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多