首页 > 解决方案 > 如何在 Kotlin 中重构这个 Android TakePicture 代码?

问题描述

我正在关注 Android 网站上的“拍照”示例(在进行过程中将代码转换为 Kotlin)。当一切都在一个类中时,它工作得很好。然后我决定将提供文件对象和字符串路径的责任委托给另一个类。但是我的应用程序开始崩溃(下面的错误报告)。我要在这里学习什么?

package com.dj.camera1


import android.os.Environment
import java.io.File
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*


class UniqueName {

    companion object {
        var mCurrentPhotoPath: String = ""
    }
    @Throws(IOException::class)
    internal fun createImageFile(): File {
        // Create an image file name
        var timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        var imageFileName = "JPEG_" + timeStamp + "_"
        var storageDir:File = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
        var image = File.createTempFile(
                imageFileName, /* prefix */
                ".jpg", /* suffix */
                storageDir      /* directory */
        )
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = image.getAbsolutePath()
        return image
    }
}

我收到了 IOException!

(编辑了上面的代码以反映代码的变化和目录到公共的变化)

我在 mainactivity 中的代码如下:

lateinit var photoContainer:File
                    try {
                        photoContainer = UniqueName().createImageFile()
                    } catch (c:IOException){
                        Log.d("MainActivity","PhotoContainer couldn't be initialised")
                    }

标签: androidimagekotlintake

解决方案


IOException 可能是因为 Permission denied 场景。请在清单文件中添加权限。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

由于它需要运行时用户的批准,因此您必须发起权限请求。

ActivityCompat.requestPermissions(mContext,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQ_CODE);

推荐阅读