【问题标题】:android File.createTempFile() fails with Environment.getExternalStorageDirector()android File.createTempFile() 因 Environment.getExternalStorageDirector() 失败
【发布时间】:2018-04-07 16:31:29
【问题描述】:

我正在尝试编写一个可以拍摄照片并将其保存到图库中的应用程序。

我遵循了 Android 开发者指南,但它只显示了如何将相同的图像放入私有目录。

这是我用来将意图发送到相机的代码

public void dispatchTakePictureIntent(View view) {

    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                2121);

        return;

    }

    //File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

    File image = null;
    try {
        image= File.createTempFile("IMG", ".jpg", storageDir);
        //tempImage=image;

    } catch (IOException e) {
        errorMessage.setVisibility(View.VISIBLE);
        Log.e("error", Log.getStackTraceString(e));
        return;
    }

    //photoURI = FileProvider.getUriForFile(this, "prova.fileprovider", image);

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null ) {
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }

}

当我在 Android Studio 模拟器 (Pixel_API_27) 上运行它时,调用 File.createTempFile 时出现错误

提前感谢您的帮助。

【问题讨论】:

  • 您遇到了哪个错误?如果有问题,我为什么要继续使用您的代码?添加返回语句。
  • 我如何得到错误?该应用程序只是关闭。
  • 没有。 logcat 会告诉你哪些异常你没有捕捉到。从 logcat 中发布相关部分。
  • FileUriExposedException?

标签: android android-studio android-camera android-camera-intent


【解决方案1】:

对于 Android 6+,您必须添加代码以要求用户确认您在清单中请求的读写权限。

Google 获取运行时权限。

您是今年发布此问题的#1246。

【讨论】:

  • 我更改了代码,如您在上面看到的。现在,当应用程序第一次运行时,它会请求权限。但是,当我再次调用该函数时,应用程序将关闭。所以还是有问题。
【解决方案2】:

我通过解决问题找到了解决方案。 我让相机意图将图片保存到私人应用程序文件夹中, 然后我将文件移至公共文件。这是代码

public void dispatchTakePictureIntent(View view) {

    //ask write permission
    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                2121);

        return;

    }

    //get path to private folder
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

    //create temp-file where the image will be saved
    File image = null;
    try {
        image= File.createTempFile("IMG", ".jpg", storageDir);

    } catch (IOException e) {
        errorMessage.setVisibility(View.VISIBLE);
        Log.e("error", Log.getStackTraceString(e));
        return;
    }


    Image = image;

    //get uri of the image
    Uri photoURI = FileProvider.getUriForFile(this, "prova.fileprovider", image);

    //send the intent to the camera
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null ) {
        takePictureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }

}

那拍照的时候我就做

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { //AFTER TAKING PICTURE

        File publicImage = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/" + Image.getName());
        Image.renameTo(publicImage); //here we move the file to the public directory
        Image = publicImage;

        //optionally one can update the gallery, but I don't need it
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2011-07-23
    • 1970-01-01
    • 2014-09-22
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多