2016-11-12 11 views
1

カメラで撮影した画像をAndroidアプリケーションでFirebaseストレージにアップロードしようとしています。問題は私が写真を撮った後、確認の 'アクティビティ'で、私は確認ボタンを押して、それは "残念なことにアプリケーションが停止した"と言います。カメラアップロード例外による写真(Firebase Storage)

私はチェックボタンを押したときにこれがこれが私のコードで、アプリケーションがギャラリーを使って写真をアップロードするためのオプションとカメラを持って

...、アプリがクラッシュした画像です。

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で許可を使用しています。私はこのFirebaseはbuild.gradleにコンパイルしてい

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

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

onActivityResult()Uriがnullであるため、例外が発生し、この

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

を投稿を開始:( –

3

を試してください:

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

その後、まだ動作していない

関連する問題