创建ImageFile以使照片无法正常工作

时间:2017-01-28 11:51:36

标签: java android file android-camera createfile

我正在编写一个使用相机的应用。我遇到了一个奇怪的问题。 " createImageFile()"使用API​​ 16在我的虚拟设备上成功创建文件。但是,当我在Sony Xperia Z3(Android 6.0.1,API 23)上运行应用程序时,不会创建该文件。我甚至都没有收到错误。我只需点击运行cameraChoosen()的按钮,没有任何反应。

经过一些重新调整后,我在createImageFile()中创建了3个Toasts。

所有Toast正在使用虚拟设备API 16。

只有Toast1适用于我的Xperia Z3

    public void cameraChoosen(){
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent

    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;

        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            //...
        }

        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this, "com.example.karol.carendal", photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

    Toast.makeText(getBaseContext(), "Toast1", Toast.LENGTH_SHORT).show();


    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    Toast.makeText(getBaseContext(), "Toast2", Toast.LENGTH_SHORT).show();

    if (image.exists()){
        Toast.makeText(getBaseContext(), "File created successfully", Toast.LENGTH_SHORT).show();
    }

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

任何想法导致问题的原因是什么?

问候:)

1 个答案:

答案 0 :(得分:0)

对于Android 6及更高版本,您不仅应该在清单中请求写入外部存储权限。

您还需要在运行时要求用户确认此权限一次。

Google获得运行时权限。

或者,您应用的用户可以转到您应用的Android设置并切换存储权限开关。