Kotlin - ошибка при захвате изображения с камеры на коде java, все в порядке

Это мой код JAVA, преобразованный в Kotlin. после преобразования код дает мне некоторую ошибку, на java он работает отлично, без каких-либо ошибок. После получения изображения с камеры выдается ошибка. что вызывает проблему ??

Я использую библиотеку 'com.github.yalantis: ucrop: 2.2.1-родной' для обрезки изображения

    private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takePictureIntent.resolveActivity(baseContext.packageManager) != null) {
        var photoFile: File? = null
        try {
            photoFile = createImageFile()
        } catch (ex: IOException) {
            // Error occurred while creating the File
        }

        if (photoFile != null) {
            try {
                photoURI = FileProvider.getUriForFile(baseContext,
                        "com.anvinsolutions.akhil.pravda.fileprovider",
                        photoFile)
                //Toast.makeText(getBaseContext(), photoURI.getPath(), Toast.LENGTH_SHORT).show();
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO)
            } catch (e: Exception) {
                e.printStackTrace()
            }

        }
    }
}
    private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takePictureIntent.resolveActivity(baseContext.packageManager) != null) {
        var photoFile: File? = null
        try {
            photoFile = createImageFile()
        } catch (ex: IOException) {
            // Error occurred while creating the File
        }

        if (photoFile != null) {
            try {
                photoURI = FileProvider.getUriForFile(baseContext,
                        "com.anvinsolutions.akhil.pravda.fileprovider",
                        photoFile)
                //Toast.makeText(getBaseContext(), photoURI.getPath(), Toast.LENGTH_SHORT).show();
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO)
            } catch (e: Exception) {
                e.printStackTrace()
            }

        }
    }
}

@Throws(IOException::class)
private fun createImageFile(): File {
    // Create an image file name
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    //Toast.makeText(getBaseContext(), timeStamp, Toast.LENGTH_SHORT).show();
    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
    Log.e("PATH ==> ",mCurrentPhotoPath)
    return image
}

/*********************************** CAMERA  */


private fun startCropActivity(uri: Uri) {
    //Log.e("","wfwefwefwef")
    var destinationFileName = "Akhil"
    destinationFileName += ".jpg"
    val uCrop = UCrop.of(uri, Uri.fromFile(File(cacheDir, destinationFileName)))
    val options = UCrop.Options()
    //options.withAspectRatio(3,4);
    options.setFreeStyleCropEnabled(true)
    //options.withMaxResultSize(396,512);
    options.setHideBottomControls(true)
    options.setCompressionFormat(Bitmap.CompressFormat.PNG)
    uCrop.withOptions(options)
    uCrop.start(this@member_form)
}

private fun pickFromGallery() {
    val intent = Intent()
    intent.type = "image/*"
    intent.action = Intent.ACTION_GET_CONTENT
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    startActivityForResult(Intent.createChooser(intent, "Select one"), REQUEST_SELECT_PICTURE)
}


private fun handleCropResult(result: Intent) {
    croppedImage = UCrop.getOutput(result)!!
    if (croppedImage != null) {
        //Toast.makeText(getBaseContext(), "OK CROP COMPLETED", Toast.LENGTH_SHORT).show();
        take_photo.setImageResource(android.R.color.transparent)
        take_photo.setImageURI(croppedImage)
        /*ViewGroup.LayoutParams layoutParams = take_photo.getLayoutParams();
        layoutParams.width = 396;
        layoutParams.height = 512;
        take_photo.setLayoutParams(layoutParams);*/
        take_photo.scaleType = ImageView.ScaleType.CENTER
        take_photo.adjustViewBounds = true
        //ResultActivity.startWithUri(SampleActivity.this, croppedImage);
    } else {
        Toast.makeText(baseContext, "Error", Toast.LENGTH_SHORT).show()
    }
}

private fun handleCropError(result: Intent) {
    val cropError = UCrop.getError(result)
    if (cropError != null) {
        Log.e("Error: ", "handleCropError: ", cropError)
        Toast.makeText(baseContext, cropError.message, Toast.LENGTH_LONG).show()
    } else {
        Toast.makeText(baseContext, "Unexpected Error!", Toast.LENGTH_SHORT).show()
    }
}


public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    Log.e("Result", "RequestCode=$requestCode Result Code=$resultCode")

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        try {
            startCropActivity(photoURI!!)
            Log.e("","startCropActivity")
        } catch (e: Exception) {
            e.printStackTrace()
        }

    }else{
        Log.e("Result"," : NOT OK")
    }

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == REQUEST_SELECT_PICTURE) {
            val selectedUri = data.data
            if (selectedUri != null) {
                startCropActivity(data.data!!)
            } else {
                Toast.makeText(baseContext, "Error", Toast.LENGTH_SHORT).show()
            }
        } else if (requestCode == UCrop.REQUEST_CROP) {
            handleCropResult(data)
        }
    }
    if (resultCode == UCrop.RESULT_ERROR) {
        handleCropError(data)
        Log.e("", "CROP RESULT ERROR")
    }
    super.onActivityResult(requestCode, resultCode, null)
}

Это сообщение об ошибке,

 Process: com.anvinsolutions.akhil.pravda, PID: 14120
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.anvinsolutions.akhil.pravda/com.anvinsolutions.akhil.pravda.member_form}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3738)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3781)
    at android.app.ActivityThread.access$1500(ActivityThread.java:153)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:5523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
 Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data
    at com.anvinsolutions.akhil.pravda.member_form.onActivityResult(member_form.kt)
    at android.app.Activity.dispatchActivityResult(Activity.java:6508)
0
0
811
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
java.lang.IllegalArgumentException: Parameter specified as non-null is null:

трудно сказать, какой именно является нулевым. Например

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {

намерение может быть нулевым, и оно должно быть помечено как нулевое. Измените это с помощью

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

Вы абсолютно правы, братан. Я думал, что проблема связана с photoURI. : P Вы сделали это! : D и у меня есть одно сомнение в этом случае на kotlin, что произойдет, если данные будут нулевыми ?? kotlin избегает исключений с нулевым указателем. что на самом деле вызывает здесь проблему?

Akhil T Mohan 11.04.2018 12:17

используйте ?. перед доступом к объекту

Blackbelt 11.04.2018 12:18

да, братан, я сделал это, и теперь у него нет проблем :) дайте мне знать, в чем именно проблема? : P новичок в котлине!

Akhil T Mohan 11.04.2018 12:20

Я также столкнулся с проблемой, и мне интересно, как данные становятся нулевыми, мы устанавливаем photoURI и передаем его

anoop4real 05.07.2018 12:48

@ anoop4real трудно сказать, не увидев кода

Blackbelt 05.07.2018 12:50

@Blackbelt - это тот же код «takePictureIntent.putExtra (MediaStore.EXTRA_OUTPUT, photoURI)», который вы отправляете как дополнительный photoURI, который должен быть частью данных, верно? Я слежу за developer.android.com/training/camera/photobasics и пытаюсь сделать в Котлине

anoop4real 05.07.2018 12:55

если вы установите то же намерение, что и setResult, да, вы должны получить обратно нулевое намерение

Blackbelt 05.07.2018 12:56

Другие вопросы по теме