0

私がやっていることは、画像をキャプチャして画像ビューで表示してファイアベースのストレージに保存することです。キャプチャ後に画像をアップロードする - Android

マイコード:

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: FATAL EXCEPTION: main Process: com.example.akoni.conread, PID: 13901 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getLastPathSegment()' on a null object reference at com.example.akoni.conread.WaterConsumptionPage$2.onClick(WaterConsumptionPage.java:87) at android.view.View.performClick(View.java:5265) at android.view.View$PerformClick.run(View.java:21534) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5728) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at 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: FATAL EXCEPTION: main Process: com.example.akoni.conread, PID: 14526 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.akoni.conread/com.example.akoni.conread.TabMenu}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getLastPathSegment()' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:3929) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5728) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getLastPathSegment()' on a null object reference at com.example.akoni.conread.WaterConsumptionPage.onActivityResult(WaterConsumptionPage.java:120) at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:151) at android.app.Activity.dispatchActivityResult(Activity.java:6502) at android.app.ActivityThread.deliverResults(ActivityThread.java:3925) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3972)  at android.app.ActivityThread.-wrap16(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)  at android.os.Handler.dispatchMessage(Handler.java:111)  at android.os.Looper.loop(Looper.java:207)  at android.app.ActivityThread.main(ActivityThread.java:5728)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

私はcapture the image and view it to the imageView firstにしたいとfirebaseに画像を保存するためにuploadをクリックします。

ありがとうございました。私は、この行がdata.getIntent()は何も返していないことを原因になると思いますので

super.onActivityResult(requestCode, resultCode, data); 

+0

同じコードから多くのエラーをダンプするのではなく、一度に1つずつ問題を解決する必要があります。 Firebaseストレージに関連するコードを削除し、最初に写真の保存を管理してください(フルイメージをアップロードする場合)。これを処理する方法に関する公式のチュートリアルがhttps://developer.android.com/training/camera/photobasics.htmlにあります。この部分を解決するための管理をした後、あなたの質問を編集し、更新されたコードを追加し、Firebaseコードとあなたが直面している問題をアップロードして追加してください。 – Luksprog

答えて

0

あなたはこのコード行を削除してください。

resultCodeもOKであることを確認する必要があります。 例:

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

私は試みましたが、それでも動作しませんでした。 – Mike

関連する問題