2016-11-12 148 views
1

我試圖將相機在Android應用程序中拍攝的圖像上傳到Firebase存儲。問題出在我拍照後,在確認「活動」中,我按下確認按鈕,它說「不幸的是應用程序已停止」。攝像頭上傳異常(Firebase存儲)

這是形象,當我按下確定按鈕,應用程序崩潰...

這是我的代碼,應用程序必須使用上傳畫廊和相機拍攝的圖片的選項。

import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 
import com.google.android.gms.tasks.OnSuccessListener; 
import com.google.firebase.storage.FirebaseStorage; 
import com.google.firebase.storage.StorageReference; 
import com.google.firebase.storage.UploadTask; 

public class MainActivity extends AppCompatActivity { 
// Note: Your consumer key and secret should be obfuscated in your source code before shipping. 


private Button selectImage; 
private Button selectImageByCamera; 
private ImageView imageView; 

private StorageReference storageReference; 
private ProgressDialog progressDialog; 

private static final int CAMERA_REQUEST_CODE = 1; 
private static final int GALLERY_INTENT= 2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.content_main); 
    storageReference=FirebaseStorage.getInstance().getReference(); 


    /* 
    * Code section to upload an image using the Gallery. 
    */ 
    selectImage=(Button)findViewById(R.id.btn_uploadImg); 
    progressDialog = new ProgressDialog(this); 

    selectImage.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      Intent intent = new Intent(Intent.ACTION_PICK); 
      intent.setType("image/*"); 
      startActivityForResult(intent, GALLERY_INTENT); 

     } 
    }); 


    /* 
    * Code section to upload an image using the Camera. 
    */ 

    selectImageByCamera=(Button)findViewById(R.id.btn_uploadImgCamera); 
    imageView=(ImageView)findViewById(R.id.imageView); 

    selectImageByCamera.setOnClickListener(new View.OnClickListener() 
    { 
     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); 

    //Upload the image to Firebase Update 
    if(requestCode==GALLERY_INTENT && resultCode == RESULT_OK) 
    { 
     progressDialog.setMessage("Uploading Image..."); 
     progressDialog.show(); 
     Uri uri = data.getData(); 
     StorageReference filepath = storageReference.child("Photos").child(uri.getLastPathSegment()); 
     filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
       Toast.makeText(MainActivity.this, "Upload done", Toast.LENGTH_LONG).show(); 
       progressDialog.dismiss(); 
      } 

     }); 
    } 
     //Code to upload image taken by the camera to firebase storage 
     if(requestCode==CAMERA_REQUEST_CODE && resultCode == RESULT_OK) 
     { 
      progressDialog.setMessage("Uploading Image..."); 
      progressDialog.show(); 

      Uri uri2 = data.getData(); 
      StorageReference filepath = storageReference.child("Photos").child(uri2.getLastPathSegment()); 

      filepath.putFile(uri2).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        { 
         Toast.makeText(MainActivity.this, "Upload done", Toast.LENGTH_LONG).show(); 
         progressDialog.dismiss(); 
        } 
       } 
      }); 
     } 


} 



@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

我有這樣的用途准許在AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.CAMERA"/> 

我有這樣的火力地堡中的build.gradle編譯

compile 'com.google.firebase:firebase-core:9.8.0' 
compile 'com.google.firebase:firebase-database:9.8.0' 
compile 'com.google.firebase:firebase-storage:9.8.0' 
compile 'com.google.firebase:firebase-auth:9.8.0' 

最後,這是當我運行引發的異常該應用程序在我的Moto G4 6.0.1(該應用程序有權使用相機和圖庫)

FATAL EXCEPTION: main 
Process: mx.com.jamba.jamba, PID: 16543 
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {mx.com.jamba.jamba/mx.com.jamba.jamba.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.access$1400(ActivityThread.java:154)                  
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 mx.com.jamba.jamba.MainActivity.onActivityResult(MainActivity.java:186)                  
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.access$1400(ActivityThread.java:154)                   
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) 

我不知道該怎麼做,這將是偉大的你們幫我:) 謝謝!

回答

0

請試試這個

Intent intent = new Intent(Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      intent.setType("image/*"); 
      startActivityForResult(intent, GALLERY_INTENT); 
+0

仍然沒有工作:( –

3

發生異常,因爲在onActivityResult()Uri爲空:

Uri uri = data.getData(); 

The documentation for capturing a camera image解釋說:

Android相機應用程序保存一個全尺寸的照片,如果你給它 文件sa進入。 您必須提供完全合格的文件名 ,相機應用程序應該保存照片

按照文檔中的示例創建文件Uri並將其添加到相機應用程序的目的中。

0
if(requestCode == CAMERA_REQUEST && resultCode == RESULT_OK){ 
     Bitmap mImageUri = (Bitmap) data.getExtras().get("data"); 
     select.setImageBitmap(mImageUri); 
    } 

然後開始張貼