Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序将拍摄照片,但不会保存它_Java_Android_Android Studio_Camera - Fatal编程技术网

Java 应用程序将拍摄照片,但不会保存它

Java 应用程序将拍摄照片,但不会保存它,java,android,android-studio,camera,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

我正在尝试拍摄一张照片并将其保存为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);
            }
        }
    }
我跟在后面。我在清单文件中也做了同样的操作,并创建了额外的
文件路径
xml文件。我让第二个方法(
photoURI
)中的Uri准确地设置了该方法的使用方式,参数与教程中的一样。这只是产生了错误,所以我基本上硬编码了我的应用程序的文件路径(我知道这不是“OOP”),现在代码几乎可以工作了

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

理想功能(同样,仅供参考):

开始这项活动。它打开了一个摄像头。(我在这里。)当我拍照时,它会问我“重试”或“确定”(如上所述)。如果我单击“确定”,文件名将写入文本文件,稍后将在其中读取,以便将图片设置为
图像按钮上的图像

提前谢谢

编辑:

我不认为这是权限问题,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"/>

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

在阅读了多弗拉明戈的评论和回答后,我找到了答案,所以部分归功于他

问题是,我没有将信息写入正确的存储空间。但解决办法是我一开始都没想到的。事实上,这是正确的。我试图编辑
path.xml
文件中的目录,以指向我开始编写代码时使用的目录(即
data/data/user/0/com.example.app/appdata/inv/inv_pics
),而它本应准确指向DoFlamingo所说的内容以及教程(即
storage/emulated/XXX


所以,让事情变得更加复杂。我会把这封信挂起来,以防对别人有帮助

在阅读了多弗拉明戈的评论和回答后,我得到了答案,因此部分归功于他

问题是,我没有将信息写入正确的存储空间。但解决办法是我一开始都没想到的。事实上,这是正确的。我试图编辑
path.xml
文件中的目录,以指向我开始编写代码时使用的目录(即
data/data/user/0/com.example.app/appdata/inv/inv_pics
),而它本应准确指向DoFlamingo所说的内容以及教程(即
storage/emulated/XXX


所以,让事情变得更加复杂。我会把这封信挂起来,以防对别人有帮助

字符串MainActivity.path只是应用程序的根路径。(data/user/0)也许你没有正确的权限?起初我是这么认为的,但后来我检查了目录本身。检查我的编辑。为什么要在与应用程序相同的位置保护图片?因为需要使用图像设置图像按钮的
src
。我认为这是最好的方法。字符串MainActivity.path只是应用程序的根路径。(data/user/0)也许你没有正确的权限?起初我是这么认为的,但后来我检查了目录本身。检查我的编辑。为什么要在与应用程序相同的位置保护图片?因为需要使用图像设置图像按钮的
src
。我想这是最好的方法。用base64解码你的图片。you have a string witch表示图片。然后使用toInternal()-函数将gernatet字符串保存在内部存储器上。使用base64解码图片。表示图片的字符串。然后使用toInternal()-函数将gernatet字符串保存在内部存储器上