Quiero hacerlo para que mi aplicación de Android (mínimo API 18) pueda tomar una foto y guardarla en una carpeta en el almacenamiento de aplicaciones. Luego, muestre la imagen en un ImageView. Hasta ahora he intentado https://developer.android.com/training/camera /photobasics.html#TaskPhotoView usando setPic () y dispatchTakePictureIntent () con createImageFile (), pero aparece el error "java.lang.IllegalArgumentException: Error al encontrar la raíz configurada que contiene / storage / emulated / 0 /Android/data/com.example.app/files/Pictures/JPEG_20170503_191954_1677887271.jpg "

-3
Jack Richard 4 may. 2017 a las 02:23

3 respuestas

La mejor respuesta

Pon esto en tu Android Manifest dentro de application

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.yourpackagename.yourappname.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

Y no olvides crear un archivo xml dentro de la carpeta res con el nombre file_paths.xml y mencionar una ruta como esta

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="appImgs" path="Android/data/" />

Y puedes llamarlo a través de File Provider así

Uri photoURI = FileProvider.getUriForFile(this,
                        "com.yourpackagename.fileprovider",
                        yourImageFile);

El nombre del archivo yourImageFile puede contener su ubicación en él. Espero que esto ayude.

0
sam 15 may. 2017 a las 11:01
private void takePhoto() {
    imageUri = generateTimeStampPhotoFileUri();
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageUri));
    startActivityForResult(intent, 2);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
        if (requestCode == 2) {
            try {
                Glide.with(this).load(imageUri).into(image_selected);

            } catch (Exception e) {
                Logger.shortToast(getString(R.string.captured_image_invalid));
            }
        }
    }
}

private File generateTimeStampPhotoFileUri() {
    File outputDir = getPhotoDirectory();
    if (outputDir != null) {
        return new File(outputDir, System.currentTimeMillis() + ".png");
    }
    return null;
}

private File getPhotoDirectory() {
    File outputDir = null;
    String externalStorageStagte = Environment.getExternalStorageState();
    if (externalStorageStagte.equals(Environment.MEDIA_MOUNTED)) {
        File photoDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        outputDir = new File(photoDir, getString(R.string.app_name));
        if (!outputDir.exists())
            if (!outputDir.mkdirs()) {
                Toast.makeText(this, "Failed to create directory " + outputDir.getAbsolutePath(), Toast.LENGTH_SHORT).show();
                outputDir = null;
            }
    }
    return outputDir;
}
-1
ZeroOne 4 may. 2017 a las 02:55

Nota: para una API superior a 23, debe pasar el permiso de tiempo de ejecución, si no se aprueba el permiso significa que arroja una excepción. La API debajo de 23 no necesita pasar el permiso de tiempo de ejecución.

Puede elegir el archivo de la galería utilizando el siguiente código

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
       intent.setType("*/*");
       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
       //intent.addFlags(ST)
       startActivityForResult(Intent.createChooser(intent, "Choose File to Upload.."), PICK_FILE_REQUEST);

Luego llame al método OnActivityResult () para obtener los datos de intención

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (resultCode == Activity.RESULT_OK) {
       if (requestCode == PICK_FILE_REQUEST) {
           if (data != null) {
               //no data present
               Uri uri = data.getData();
              String filePath = data.getData().getPath();

               String name = getContentName(getContentResolver(), uri);
               try {
                   bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

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


               imageView.setImageBitmap(bitmap);
               textView.setText(name);

               return;
           }

       }
   }

Luego llame al método siguiente para obtener el nombre del archivo del almacenamiento y configure la imagen en la vista de imagen

`

public static String getContentName(ContentResolver resolver, Uri uri) {
       Cursor cursor = resolver.query(uri, null, null, null, null);
       cursor.moveToFirst();
       int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
       if (nameIndex >= 0) {
           return cursor.getString(nameIndex);
       } else {
           return null;
       }
   }`

Por favor intente esto funciona ...

-1
Prabha Karan 4 may. 2017 a las 04:34