20 octubre, 2024
Compartir Imagen en Android
Para programar la funcionalidad Share en Android debemos usar permisos dependiendo del recurso a compartir, sea una imagen, url o texto
 
              
                Suscríbete a nuestro canal en Youtube
SuscríbirseUtilizando FileProvider para evitar problemas con las nuevas políticas de Android relacionadas con el acceso a archivos:
AndroidManifest.xml: Actualización de permisos y declaración de FileProvider
xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application>
    ...
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>
Crear el archivo file_paths.xml en res/xml/file_paths.xml
Este archivo define las rutas seguras para los archivos que puedes compartir. Debes crearlo si no existe.
xml
<paths>
    <external-path name="external_files" path="." />
</paths>
Ahora en MainActivity.java
Aquí te dejo la implementación del código mejorado para compartir la imagen:
java
public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_EXTERNAL_STORAGE = 100;
    private Button button;
    private ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.boton);
        imageView = findViewById(R.id.imagen);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Verificar permisos
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                            PERMISSION_REQUEST_EXTERNAL_STORAGE);
                } else {
                    // Compartir imagen si los permisos ya fueron otorgados
                    shareImage();
                }
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_EXTERNAL_STORAGE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                shareImage();
            } else {
                Toast.makeText(this, "No se otorgó permiso para acceder al almacenamiento", Toast.LENGTH_SHORT).show();
            }
        }
    }
    private void shareImage() {
        try {
            // Obtener el bitmap de la ImageView
            Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            // Guardar la imagen en un archivo temporal
            File cachePath = new File(getCacheDir(), "images");
            cachePath.mkdirs(); // Crear directorio si no existe
            File file = new File(cachePath, "image.png");
            FileOutputStream stream = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); // Guardar como PNG
            stream.close();
            // Obtener la URI del archivo usando FileProvider
            Uri imageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", file);
            // Crear intent para compartir la imagen
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("image/*");
            shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            // Iniciar la actividad de compartir
            startActivity(Intent.createChooser(shareIntent, "Compartir imagen vía"));
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "Error al compartir la imagen", Toast.LENGTH_SHORT).show();
        }
    }
}
Mejoras:
- 
	FileProvider: Utiliza FileProviderpara acceder de manera segura a los archivos almacenados en el dispositivo, cumpliendo con las restricciones de seguridad de Android 7.0 y versiones posteriores.
- 
	Permisos de lectura y escritura: Se solicita tanto permiso de escritura como de lectura en el almacenamiento. 
- 
	Manejo de excepciones: Agrega manejo de errores para asegurar que el proceso de compartir imagen sea robusto. 
- El archivo file_paths.xmles clave para queFileProviderfuncione correctamente.
- Es importante manejar correctamente los permisos de lectura y escritura en el almacenamiento, especialmente en versiones de Android superiores a 6.0 (Marshmallow).
Leido 3575 veces | 0 usuarios
Código fuente no disponible.
 
                         
                         
                         
                 
                 
                 
                 
                             
                             
                             
                            