2017-12-08 24 views
0

私はこのトピック私はちょうどそれを働かせることができない何らかの理由。ユーザーが写真を撮ったところまで来たら、チェックマークに当たってから、アプリがクラッシュします。カメラから画像を取得してFirebaseにアップロードしようとすると苦労する - java.lang.IllegalStateException:uriはnullであってはならない

は、具体的に、このラインで:

val filepath = mFirebaseStorage.child("Users").child(prefs.UID).child(uri.lastPathSegment) 

私のコードは次のようなものになります。

onLaunchCamera - ユーザーが警告ボックスから "カメラ" を選択したときに

private fun onLaunchCamera() { 
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) 
    //Ensure there's a camera activity to handle the intent 
    if (takePictureIntent.resolveActivity(packageManager) != null) { 
     var photoFile: File? = null 
     try { 
      photoFile = createImageFile() 
     } catch (e: IOException) { 
      //log error 
      Log.e(TAG, e.toString()) 
     } 
     //continue only if file was successfully created! 
     if (photoFile != null) { 
      val photoURI = FileProvider.getUriForFile(this, 
        "com.android.projectrc.fileprovider", 
        photoFile) 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) 
      startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) 
     } 
    } 
} 

と呼ばれるがonActivityResult

override protected fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { 
    super.onActivityResult(requestCode, resultCode, data) 

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     val progressDialog = indeterminateProgressDialog("Uploading...") 
     progressDialog.show() 
     Log.d(TAG,"URI:: ${photoURI}") 
     val uri = data.data 

     val filePath = mFirebaseStorage.child("Users").child(prefs.UID) 
       .child("ProfileImage").child(uri.lastPathSegment) 
     filePath.putFile(photoURI!!).addOnSuccessListener(OnSuccessListener <UploadTask.TaskSnapshot >() { 
      fun onSuccess(taskSnapshot : UploadTask.TaskSnapshot) { 
       toast("Upload Successful!") 
       progressDialog.dismiss() 
      } 
     }).addOnFailureListener(OnFailureListener() { 
      fun onFailure(e : Exception) { 
       Log.e(TAG, e.toString()) 
       toast("Upload Failed!") 
      } 
     }); 
     //val bundle = data.extras 
    } 
} 

createImageFile

private fun createImageFile(): File { 
    // Create an image file name 
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US) 
    val imageFileName = "JPEG_" + timeStamp + "_"; 
    val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) 
    val image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = image.absolutePath; 
    return image 
} 

のAndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.READ_PROFILE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE" /> 

<application 
    android:name=".App" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.android.projectrc.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths" /> 
    </provider> 

files_path.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/com.android.projectrc/files/Pictures" /> 
</paths> 

でも、コンソールが出力するときにphotoURIが表示される - 私はかなり犠牲になり、助けに感謝します!

+0

あなたは 'onActivityResult'の正しいコードを投稿していません –

+0

@BobSnyderが修正されました! –

+0

あなたのマニフェストでこれが問題ではありませんが、これを小文字に変更してください: 'ANDROID.PERMISSION' –

答えて

1

answer to this related questionURIACTION_IMAGE_CAPTURE意図にEXTRA_OUTPUTとして渡されたとき、URIonActivityResult()に意図パラメータのデータとして返されていないことを説明しています。

これは、onActivityResult()で利用できるように、URIをクラス変数に保存する必要があることを意味します。あなたがすでにクラス変数として宣言photoURIを持っていると表示されますが、それはonLaunchCamera()でこのコードの値です規定することを意図していること:

 val photoURI = FileProvider.getUriForFile(this, 
       "com.android.projectrc.fileprovider", 
       photoFile) 

しかしvalphotoURIの新しいインスタンスを作成して、値がに格納されていませんクラスフィールドを必要に応じて選択します。 valを削除します。

+0

あなたの提案を試しても、サイコロはありません。その行に到達することさえできません(私は関数全体にブレークポイントを持っています)。 onActivityResultの中に戻ってくるのは、データやエクストラがないことに気付きました。私が実際に作成したphotoURIは、実際にカメラショットとアプリに戻ってどこに行きましたか?それは実際に写真について何も返さないのはなぜですか? –

+0

さて、問題をもう少し絞り込んだところ、この行 'val uri = data.data'が問題であるように見えます。したがって、' uri.lastPathSegment'で問題を引き起こしているようです。 –

+0

'Log'ステートメントをこの 'val photoURI = FileProvider。getUriForFile(...) 'を呼び出し、' photoURI'の値を出力します。 –

関連する問題