2016-11-12 1 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에 권한을 용도 :이 중포 기지가 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) 

나는 무엇을 해야할지 모르겠다. 너희들이 나를 도울 수있을 것이다. 고마워! onActivityResult()에서 Uri가 null 때문에

답변

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

을 시도하십시오 :

Uri uri = data.getData(); 

The documentation for capturing a camera image 설명 :

안드로이드 카메라 응용 프로그램은 전체 크기를 저장 당신이 그것을 줄 경우 사진 sa에 파일 에. 정규화 된 파일 이름을 제공해야합니다. 여기에서 카메라 앱은 사진을 저장해야합니다.

문서의 예를 따라 Uri 파일을 만들고 카메라 응용 프로그램의 의도에 추가하십시오.

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

후하지 여전히

관련 문제