拍摄图像后相机未保存

时间:2017-08-23 12:11:08

标签: android nullpointerexception android-camera kotlin-android-extensions

在Redmi 1s中拍摄图像后相机未保存。 这在三星j5-2016中非常有用。我想拍照并上传到服务器上。在上传之前我正在压缩图像,所以我需要文件名和文件路径。如何在活动结果方法中显示 fileName

相机意图

val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                        if (takePictureIntent.resolveActivity(activity.packageManager) != null) {
                            startActivityForResult(takePictureIntent, 102)
                        }

在三星手机中,这可以保存图片,因此我可以从uri获取文件。但在redmi 1s中,我无法获得uri。我认为似乎redmi 1s没有保存拍照,因此我无法获取文件。 片段中的 OnActivityResult显示为:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 102) && resultCode == Activity.RESULT_OK && data != null) {
        val uri = data.data

                val mimeType = activity.contentResolver.getType(uri)
                if (mimeType == null) {
                    val path = getPath(uri)
                    if (path == null) {
                        fileName = FilenameUtils.getName(uri.toString())
                    } else {
                        val file = File(path)
                        fileName = file.getName()
                    }
                } else {
                    val returnUri = data.getData()
                    val returnCursor = activity.contentResolver.query(returnUri, null, null, null, null)
                    val nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
                    val sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE)
                    returnCursor.moveToFirst()
                    fileName = returnCursor.getString(nameIndex)
                    val size = Long.toString(returnCursor.getLong(sizeIndex));
                }
}
    }

我在

中收到错误
val mimeType = activity.contentResolver.getType(uri)

错误日志

08-23 17:17:52.039 12008-12008/? W/System.err: java.lang.NullPointerException
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.content.ContentResolver.acquireExistingProvider(ContentResolver.java:1405)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.content.ContentResolver.getType(ContentResolver.java:304)
08-23 17:17:52.039 12008-12008/? W/System.err:     at in.motiontech.wave.fragment.ReviewOrderFragment.onActivityResult(ReviewOrderFragment.kt:396)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:164)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:5434)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:3363)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1260)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
08-23 17:17:52.039 12008-12008/? W/System.err:     at android.os.Looper.loop(Looper.java:136)
08-23 17:17:52.049 12008-12008/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5052)
08-23 17:17:52.049 12008-12008/? W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
08-23 17:17:52.049 12008-12008/? W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
08-23 17:17:52.049 12008-12008/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
08-23 17:17:52.049 12008-12008/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
08-23 17:17:52.049 12008-12008/? W/System.err:     at dalvik.system.NativeStart.main(Native Method)

如果我做错了请帮助我,请提出其他选择。

我也查了一些Stackoverflow帖子,但无法找到答案:

Camera Intent not saving photo

Camera is not saving after taking picture

Can not save camera's captured photo in application's "files" folder

修改 我也试过 Camera Intent

val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                        val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
                        var output = File(dir, System.currentTimeMillis().toString() + ".jpeg")
                        if (takePictureIntent.resolveActivity(activity.packageManager) != null) {
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, output)
                            startActivityForResult(takePictureIntent, 102)
                        }

1 个答案:

答案 0 :(得分:2)

  

在Redmi 1s中拍摄图像后相机未保存。

它不会"保存"任何与大多数相机应用程序您专门设置了ACTION_IMAGE_CAPTURE Intent以便不在任何地方保存照片。

  

这在三星j5-2016中效果很好

只是因为您在该设备上使用了有缺陷的相机应用程序。

ACTION_IMAGE_CAPTURE不应该返回Uri。它应该做两件事之一:

  1. 如果您在EXTRA_OUTPUT ACTION_IMAGE_CAPTURE上加Intent,则相机应用会将全分辨率照片保存到您提供的Uri额外的

  2. 否则,您在返回的Bitmap

  3. 上通过getParcelableExtra("data")返回Intent

    由于您没有EXTRA_OUTPUT,因此您不应期望将全分辨率照片保存在任何地方。

    This sample app显示了如何使用EXTRA_OUTPUT