Compartir imagen dibujable a otras aplicaciones correctamente (que comparten PNG a Whatsapp falla sin FileProvider)

owlswipe:

Estoy creando una aplicación para Android, donde el usuario puede seleccionar una de varias imágenes para compartir (que se almacenan en la drawablecarpeta) y la aplicación abre un selector de ACTION_SEND estándar para permitirles compartir a cualquier aplicación que soporte archivos PNG, al igual que :

Uri imageUri = Uri.parse("android.resource://com.owlswipe.imagesharer/" + getImage());

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
sendIntent.setType("image/png");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(sendIntent, "share to an app"));

public int getImage() {
return R.drawable.firstimage;
}

Sin embargo, si el usuario selecciona la compartan a Whatsapp, que no funciona correctamente: en lugar de interpretarlo como una imagen (como si se comparte normalmente una foto a Whatsapp) se piensa que es un documento que se llama "sin título" y no muestra como una imagen.

problema Whatsapp

La apertura de este documento sin título en un equipo revela que se llama DOC-20180721-WA0012.con ninguna extensión de archivo! Adición manual de una pnghasta el final del nombre de archivo revela la imagen correcta.

Haciendo de este raro (pero sin duda pueden resolver de alguna manera!):

  • Si el usuario elige para abrir la imagen en una aplicación SMS, por ejemplo, la imagen aparece normalmente.

  • Esto ha sucedido con múltiples dispositivos (Pixel 2 de la pág beta y Nokia 2 en 7.1.1)

  • Este problema no ocurre con otras aplicaciones, donde PNG se pueden enviar a través de Whatsapp como una imagen normal (a pesar de que parecen ser convertidos automáticamente a archivos JPEG por Whatsapp).


¿Qué puedo hacer para asegurarse de Whatsapp ve mi imagen como un archivo PNG adecuado? Por otra parte, ¿cómo puedo compartir correctamente una imagen pre-cargado desde mi aplicación tal que cada aplicación puede interpretar correctamente?

owlswipe:

He resuelto esto mediante la correcta realización de un FileProvider! Esta guía me ayudó mucho , pero voy a dar un resumen breve aquí.

Dentro de la applicationetiqueta de su Manifiesto, empezar a declarar su nueva FileProvider de este modo:

<provider
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
android:authorities="${applicationId}">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_provider_paths"/>

</provider>

A continuación, cree un nuevo directorio llamado xml(control-clic en su resen Android Studio y vaya a Nuevo> Directorio). A continuación, cree un nuevo archivo dentro de xmlllamada file_provider_paths(control-clic en el nuevo xmldirectorio, y vaya a Nuevo> Archivo, y el nombre file_provider_paths.xml). Añadir este código a ese nuevo archivo xml:

<paths>
    <cache-path name="cache" path="/" />
    <files-path name="files" path="/" />
</paths>

Por último, utilizarlo en su MainActivity o donde sea, así:

// create new Intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);

// set flag to give temporary permission to external app to use your FileProvider
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// generate URI, I defined authority as the application ID in the Manifest, the last param is file I want to open
Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, imageFile);
intent.putExtra(Intent.EXTRA_STREAM, uri);

// Set type to only show apps that can open your PNG file
intent.setType("image/png");

// start activity!
startActivity(Intent.createChooser(intent, "send"));

Para conseguir que la imageFilede una imagen en mi drawabledirectorio, lo convierte en primer lugar a un mapa de bits, y luego en un objeto File, así:

// create file from drawable image
Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.yourbeautifulimage);

File filesDir = getApplicationContext().getFilesDir();
File imageFile = new File(filesDir, "ABeautifulFilename.png");

OutputStream os;
try {
    os = new FileOutputStream(imageFile);
    bm.compress(Bitmap.CompressFormat.PNG, 100, os); // 100% quality
    os.flush();
    os.close();
} catch (Exception e) {
    Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
}

Y ya está, cada aplicación puede ver su imagen compartida ahora!

Supongo que te gusta

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