1

I am trying to work with Android studio using Firebase by opening default camera app and capturing the Image and uploading to the Firebase Storage. However i am unable to do so. But i am able to open the camera and click the image. once I click next i will the app is crashing.

I have successfully connected Firebase Storage, Authentication and Realtime Database.

I think i am missing something in the code. Any help would be appreciated

Getting Error Message Here:

StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment());

Please check my entire code and let me know if there is any error.

Here is my code:

activity_main.xml :

<Button
    android:id="@+id/btnOpenCamera"
    android:layout_width="252dp"
    android:layout_height="45dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:text="open camera"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.457"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.049" />

<ImageView
    android:id="@+id/ivImage"
    android:layout_width="360dp"
    android:layout_height="310dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/btnOpenCamera"
    app:layout_constraintVertical_bias="0.272"
    app:srcCompat="@drawable/common_full_open_on_phone" />

MainActivty.java :

public class MainActivity extends AppCompatActivity {

    private Button openCamera;
    private ImageView image;

    private static final int CAMERA_REQUEST_CODE = 100;

    private StorageReference mStorage;
    private ProgressDialog mProgress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStorage = FirebaseStorage.getInstance().getReference();

        openCamera = (Button) findViewById(R.id.btnOpenCamera);
        image = (ImageView) findViewById(R.id.ivImage);

        mProgress = new ProgressDialog(this);

        openCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                startActivityForResult(intent, CAMERA_REQUEST_CODE);
            }
        });
    }

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

    if(requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK){

        mProgress.setMessage(("Uploading Image..."));
        mProgress.show();

        Uri uri = data.getData();

        StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment());

        filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                mProgress.dismiss();

                Toast.makeText(MainActivity.this, "Uploading Finished...", Toast.LENGTH_SHORT).show();


            }
        });
    }
}
}

Logcat :

10-05 18:07:26.533 4250-4250/com.example.android.camera E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.android.camera, PID: 4250
                                                                          **java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.android.camera/com.example.android.camera.MainActivity}: 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:3720)
                                                                              at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763)
                                                                              at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
                                                                           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.android.camera.MainActivity.onActivityResult(MainActivity.java:69)
                                                                              at android.app.Activity.dispatchActivityResult(Activity.java:6470)
                                                                              at android.app.ActivityThread.deliverResults(ActivityThread.java:3716)
                                                                              at android.app.ActivityThread.handleSendResult(ActivityThread.java:3763) 
                                                                              at android.app.ActivityThread.-wrap16(ActivityThread.java) 
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403) 
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                              at android.os.Looper.loop(Looper.java:148) 
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5443) 
                                                                              at java.lang.reflect.Method.invoke(Native Method) 
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  10-05 18:07:28.714 4250-4347/com.example.android.camera W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
ʍѳђઽ૯ท
  • 16,646
  • 7
  • 53
  • 108

2 Answers2

0

Try this:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] data = baos.toByteArray();
        filepath.putBytes(data).add....
    }
}

it seem's to me that data intent contains the image instead of uri

Dima Zhylko
  • 65
  • 2
  • 8
0

Use this method as activityResult, it will work fine `

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK){

        mProgress.setMessage(("Uploading Image..."));
        mProgress.show();

        Bitmap bitmap = (Bitmap)data.getExtras().get("data");
        image.setImageBitmap(bitmap);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] byteData = baos.toByteArray();

        UploadTask uploadTask = mStorage.child("Photos").child(data.getData().getLastPathSegment()).putBytes(byteData);
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                mProgress.dismiss();
                Toast.makeText(MainActivity.this, "Upload failed " + exception , Toast.LENGTH_SHORT).show();
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
                // ...
                mProgress.dismiss();
                Toast.makeText(MainActivity.this, "Upload success", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

`

Fayaz
  • 1,846
  • 2
  • 16
  • 21