Aplicación tomará una foto, pero no la salvará

Ethan Moore:

Estoy tratando de tomar una foto y guardarla como un archivo JPEG. Para su información, si ayuda, esta es la tercera actividad en el programa que el usuario podría acceder a, y estoy esperando para guardar la imagen en los datos / usuario / 0 / com.example.app / AppData / INV / inv_pics expediente. Aquí es lo que tengo:


    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);
            }
        }
    }

Estoy vagamente siguiente este tutorial . He hecho lo mismo en mi archivo de manifiesto, y han creado el adicional de file_pathsarchivo XML. Tuve la URI en el segundo método ( photoURI) establecer exactamente cómo el método tenía, con los argumentos como lo fue en el tutorial. Esto fue sólo producen errores, y por lo que, básicamente, no modificable la ruta del archivo a mi aplicación en ese país (que sé que no es "programación orientada a objetos") y ahora el código casi funciona.

Cuando ejecuto la aplicación, y llego a la actividad, se abre la cámara. Eso es genial. Hacer clic en el botón para tomar la imagen y la pantalla se congela por un segundo, pero no me da los botones "reintento" o "OK" en la parte inferior - el resultado esperado.

Función ideal (de nuevo, para su información):

Llegar a esta actividad. Se abre una cámara. (Estoy aquí.) Cuando tomo la foto, me preguntaba "Reintentar" o "OK" (como se mencionó anteriormente). Si hago clic en "Aceptar" el nombre del archivo se escribe en un archivo de texto en el que sería más tarde leer con el fin de establecer la imagen como la imagen de una Image Button.

¡Gracias por adelantado!

Editar:

No creo que es un problema de permisos, a) me he dado los permisos en el Manifiesto, y b) el primer método crea realmente el archivo, es sólo en blanco, lo que me permite saber las carreras de código hasta por lo menos el photoFile = createImageFile();de la segundo método.

Como sé que probablemente va a pedir, aquí están los errores que me da cuando intento utilizar el código proporcionado por el tutorial:

    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)```
Ethan Moore:

La respuesta vino a mí después de leer en los comentarios y respuestas de Doflamingo, el crédito de manera parcial a él.

El problema era, de hecho, que no estaba escribiendo para el almacenamiento correcto. Pero la solución era algo que ni siquiera había pensado en un principio. El tutorial fue hecho en el clavo. He intentado editar el directorio en el paths.xmlarchivo para apuntar a un directorio que estaba usando cuando empecé a escribir el código (a saber data/data/user/0/com.example.app/appdata/inv/inv_pics) cuando debería haber señalado a exactamente lo que estaba diciendo DoFlamingo - y el tutorial (a saber storage/emulated/XXX).

Por lo tanto, aquí es de hacer las cosas mucho más complicado de lo que tenía que estar. Voy a dejar el cargo en caso de que ayuda a alguien.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=362702&siteId=1
Recomendado
Clasificación