20 octubre, 2024
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:
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>
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>
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();
}
}
}
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.
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.
file_paths.xml
es clave para que FileProvider
funcione correctamente.Leido 2752 veces | 0 usuarios
Código fuente no disponible.
© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2025