繁体   English   中英

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

[英]Application will take a picture, but will not save it

我正在尝试拍照并将其另存为 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);
            }
        }
    }

我松散地遵循本教程 我在我的清单文件中做了同样的事情,并创建了额外的file_paths xml 文件。 我在第二种方法 ( photoURI ) 中使用了 Uri 来准确设置方法如何使用它,并使用教程中的参数。 这只是产生错误,所以我基本上将我的应用程序的文件路径硬编码在那里(我知道它不是“OOP”),现在代码几乎可以工作了。

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

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

进入这个活动。 它打开一个摄像头。 (我在这里。)当我拍照时,它会问我“重试”或“确定”(如上所述。)如果我单击“确定”,文件名将被写入文本文件,稍后将在该文件中读取以将图片设置为Image Button上的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)```

使用 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"/>

在阅读了 DoFlamingo 的评论和答案后,我得到了答案,因此部分归功于他。

问题实际上是我没有写入正确的存储。 但解决方案是我最初没想到的。 教程实际上是正确的。 我尝试编辑paths.xml文件中的目录以指向我开始编写代码时使用的目录(即data/data/user/0/com.example.app/appdata/inv/inv_pics )已经指出了 DoFlamingo 在说什么 - 以及教程(即storage/emulated/XXX )。

所以,这是为了让事情变得比他们需要的更复杂。 如果它对某人有帮助,我会留下这个帖子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM