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íbirse

Utilizando 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:

  1. FileProvider: Utiliza FileProvider para acceder de manera segura a los archivos almacenados en el dispositivo, cumpliendo con las restricciones de seguridad de Android 7.0 y versiones posteriores.

  2. Permisos de lectura y escritura: Se solicita tanto permiso de escritura como de lectura en el almacenamiento.

  3. Manejo de excepciones: Agrega manejo de errores para asegurar que el proceso de compartir imagen sea robusto.

  • El archivo file_paths.xml es clave para que FileProvider funcione 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 2752 veces | 0 usuarios

Código fuente no disponible.

Compartir link del tutorial con tus amigos


Android PHP MySql App Restaurant

USD 12.00

Descarga del código fuente

Android PHP MySql App Restaurant
App Minimarket con Scanner QR

USD 200.00

Descarga del código fuente

App Minimarket con Scanner QR
Curso de Android

USD 17.00

Descarga del código fuente

Curso de Android

Más tutoriales de Android

Codea Applications

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú

© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2025