应用程序会拍照,但不会保存

时间:2019-12-02 06:53:03

标签: java android android-studio camera

我正在尝试拍照并将其另存为jpeg。供您参考,如果有帮助,这是用户访问的程序中的第三项活动,我希望将图片保存到data / user / 0 / com.example.app / appdata / inv / inv_pics中文件。这就是我所拥有的:


    static String currentPhotoPath;

    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 = new File (MainActivity.path+"/com.example.app/appdata/inv/inv_pics");
        storageDir.mkdir();
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

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

    private void dispatchTakePictureIntent() {
        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) {
                ex.printStackTrace();
                // Error occurred while creating the File
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Uri photoURI = Uri.parse((MainActivity.path+"/com.example.app/appdata/inv/inv_pics"));
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }

我很随意地关注this tutorial。我在清单文件中做了同样的操作,并创建了附加的file_paths xml文件。我在第二种方法(photoURI中使用Uri设置了该方法的使用方式,并使用了教程中的参数。这只是在产生错误,所以我基本上在那儿对应用程序的文件路径进行了硬编码(我知道这不是“ OOP”),现在代码几乎可以工作了。

当我运行该应用程序并进入活动时,它将打开相机。那很棒。我单击按钮拍摄照片,屏幕冻结了一秒钟,但是底部没有显示“重试”或“确定”按钮-预期的结果。

理想的功能(再次供您参考):

进入此活动。打开相机。 (我在这里。)当我拍照时,它会问我“重试”或“确定”(如上所述)。如果单击“确定”,文件名将被写入文本文件,以后将进行读取以将图片设置为Image Button上的图片。

谢谢!

编辑:

我不认为这是一个权限问题,a)我具有清单中声明的​​权限,b)第一种方法确实创建了文件,只是空白,这让我知道代码至少要运行到第二种方法中的photoFile = createImageFile();

由于我知道您可能会问,这是当我尝试使用教程提供的代码时给我的错误:

    Process: com.example.app, PID: 4700
    java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.app/files/Pictures/JPEG_20191201_235937_8382995102420149896.jpg
        at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
        at com.erthad.boutique.InventoryActivity2.dispatchTakePictureIntent(InventoryActivity2.java:59)
        at com.erthad.boutique.InventoryActivity2.access$000(InventoryActivity2.java:21)
        at com.erthad.boutique.InventoryActivity2$1.onClick(InventoryActivity2.java:82)
        at android.view.View.performClick(View.java:7341)
        at android.view.View.performClickInternal(View.java:7307)
        at android.view.View.access$3200(View.java:846)
        at android.view.View$PerformClick.run(View.java:27796)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7156)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)```

2 个答案:

答案 0 :(得分:0)

使用Base64将图片作为字符串获取:

从内部读取

public StringBuilder fromInternal(String filename) {

        StringBuilder sb = new StringBuilder();
        try {

            FileInputStream fileInputStream = context.openFileInput(filename);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                sb.append(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sb;
    }

将文件保存到内部:

    public void toInternal(String data,String sFileName){

        File file = new File(Environment.getExternalStorageDirectory()+"/"+sFileName);
        byte[] bytes = data.getBytes();
        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(file);
            outputStream.write(bytes);
            outputStream.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

并在您的AndroidManifest.xml

中添加此权限
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

答案 1 :(得分:0)

在阅读了DoFlamingo的评论和答案后,答案就传给了我,所以对他有些偏爱。

问题实际上是我没有写正确的存储。但是解决方案是我最初甚至没有想到的。 tutorial实际上在现场。我尝试编辑paths.xml文件中的目录,以指向我开始编写代码时所使用的目录(即data/data/user/0/com.example.app/appdata/inv/inv_pics),而该目录本应准确指向DoFlamingo所说的内容-本教程(即storage/emulated/XXX)。

因此,这是要使事情复杂到需要的程度。如果有帮助,我将保留该职位。