拍照并上传到 Android Firebase 错误
Take Picture and Upload to Android Firebase Error
我正在编写一个简单的代码来即时捕获相机图像并将其上传到 android firebase。
来自 Referance Here
尝试将完整代码编写为 android 工作室文档。
但是在logcat中我们可以显示这段代码发生错误uri.getLastPathSegment()。
如何解决这个错误?
错误Logcat:
--------- beginning of crash
05-23 14:52:06.627 12364-12364/com.example.hasib_pc.firebasetest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hasib_pc.firebasetest, PID: 12364
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { }} to activity {com.example.hasib_pc.firebasetest/com.example.hasib_pc.firebasetest.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:4268)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getLastPathSegment()' on a null object reference
MainActivity 完整代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final int IMAGE_CAPTURE_CODE = 3;
private Button uploadBtn;
private ImageView showImage;
private StorageReference mStorage;
private ProgressDialog progressDialog;
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
Log.d(TAG, "createImageFile: start.");
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName,
".jpg",
storageDir
);
mCurrentPhotoPath = image.getAbsolutePath();
Log.d(TAG, "createImageFile: End.");
return image;
}
private void takePictureIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Log.e(TAG, "takePictureIntent: IOException: "+ex.getMessage(),ex);
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(intent, IMAGE_CAPTURE_CODE);
Log.d(TAG, "takePictureIntent: End.");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStorage = FirebaseStorage.getInstance().getReference();
uploadBtn = findViewById(R.id.uploadBtnId);
showImage = findViewById(R.id.imageShowId);
progressDialog = new ProgressDialog(this);
uploadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
takePictureIntent();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: Started.");
if(requestCode == IMAGE_CAPTURE_CODE && resultCode == RESULT_OK){
Log.d(TAG, "onActivityResult: start uploading");
progressDialog.setMessage("Uploading...");
progressDialog.show();
Uri uri = data.getData();
Log.d(TAG, "onActivityResult: set filepath");
StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment());
Log.d(TAG, "onActivityResult: try to putFile");
filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d(TAG, "onSuccess: started.");
Toast.makeText(MainActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, "Upload Failed!", Toast.LENGTH_SHORT).show();
}
});
}
}
}
这是我的错误。我找到了解决方案。
创建一个 Uri instance veriable。 private Uri photoURI;
然后用 Intent putExtra 方法发送这个 Uri。
photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
并通过 StorageReference putFile 方法传递 uri 对象
filepath.putFile(photoURI)
我在 onCreate 方法中调用了 Uri photoURI insted of Class instance veriable 这就是为什么得到 NullPointerException 的原因。
我正在编写一个简单的代码来即时捕获相机图像并将其上传到 android firebase。
来自 Referance Here
尝试将完整代码编写为 android 工作室文档。 但是在logcat中我们可以显示这段代码发生错误uri.getLastPathSegment()。 如何解决这个错误?
错误Logcat:
--------- beginning of crash
05-23 14:52:06.627 12364-12364/com.example.hasib_pc.firebasetest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hasib_pc.firebasetest, PID: 12364
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { }} to activity {com.example.hasib_pc.firebasetest/com.example.hasib_pc.firebasetest.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:4268)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getLastPathSegment()' on a null object reference
MainActivity 完整代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final int IMAGE_CAPTURE_CODE = 3;
private Button uploadBtn;
private ImageView showImage;
private StorageReference mStorage;
private ProgressDialog progressDialog;
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
Log.d(TAG, "createImageFile: start.");
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName,
".jpg",
storageDir
);
mCurrentPhotoPath = image.getAbsolutePath();
Log.d(TAG, "createImageFile: End.");
return image;
}
private void takePictureIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Log.e(TAG, "takePictureIntent: IOException: "+ex.getMessage(),ex);
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(intent, IMAGE_CAPTURE_CODE);
Log.d(TAG, "takePictureIntent: End.");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStorage = FirebaseStorage.getInstance().getReference();
uploadBtn = findViewById(R.id.uploadBtnId);
showImage = findViewById(R.id.imageShowId);
progressDialog = new ProgressDialog(this);
uploadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
takePictureIntent();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: Started.");
if(requestCode == IMAGE_CAPTURE_CODE && resultCode == RESULT_OK){
Log.d(TAG, "onActivityResult: start uploading");
progressDialog.setMessage("Uploading...");
progressDialog.show();
Uri uri = data.getData();
Log.d(TAG, "onActivityResult: set filepath");
StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment());
Log.d(TAG, "onActivityResult: try to putFile");
filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d(TAG, "onSuccess: started.");
Toast.makeText(MainActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, "Upload Failed!", Toast.LENGTH_SHORT).show();
}
});
}
}
}
这是我的错误。我找到了解决方案。
创建一个 Uri instance veriable。 private Uri photoURI;
然后用 Intent putExtra 方法发送这个 Uri。
photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
并通过 StorageReference putFile 方法传递 uri 对象
filepath.putFile(photoURI)
我在 onCreate 方法中调用了 Uri photoURI insted of Class instance veriable 这就是为什么得到 NullPointerException 的原因。