尝试使用默认相机应用并使用 Firebase,并捕获图像并上传到 Firebase 存储



我正在尝试使用Firebase与Android工作室合作,方法是打开默认的相机应用程序并捕获图像并上传到Firebase存储。但是我无法这样做。但是我可以打开相机并单击图像。一旦我单击下一步,应用程序就会崩溃。

我已经成功连接了 Firebase 存储、身份验证和实时数据库。

我想我在代码中缺少一些东西。任何帮助将不胜感激

在此处收到错误消息:

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

请检查我的整个代码,如果有任何错误,请告诉我。

这是我的代码:

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" />

主要活动.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();

}
});
}
}
}

日志猫 :

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.

试试这个:

@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....
}
}

在我看来,数据意图包含图像而不是 URI

使用此方法作为 activityResult,它将正常工作 `

@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();
}
});
}
}

'

最新更新