Cómo compartir una imagen capturada con otra aplicación en Android

Requisito previo: cómo abrir la cámara a través de Intent y capturar una imagen

En este artículo, intentaremos enviar la imagen capturada ( de este artículo ) a otras aplicaciones que utilicen Android Studio .

Acercarse:

  1. La imagen capturada se almacena en el almacenamiento externo. Por lo tanto, debemos solicitar permiso para acceder a los archivos del usuario . Así que tome permiso para acceder al permiso de almacenamiento externo en el archivo de manifiesto.
  2. Aquí pictureDir(File) apunta al directorio de almacenamiento externo llamado DIRECTORY_PICTURES
    File pictureDir
        = new File(
            Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES),
            "CameraDemo");
    
  3. En el método onCreate(), comprueba si el directorio pictureDir está presente o no. De lo contrario, cree el directorio con el siguiente código
    if(!pictureDir.exists()){
        pictureDir.mkdirs();
    }
    
  4. Cree otro método llamado callCameraApp() para obtener la imagen en la que se hizo clic del almacenamiento externo.
    • Captura la imagen usando Intent
    • Cree un archivo para almacenar la imagen en el directorio pictureDir.
    • Obtener el objeto URI de este archivo de imagen
    • Coloque la imagen en el almacenamiento de intenciones para acceder desde otros módulos de la aplicación.
    • Pase la imagen a través de la intención de startActivityForResult()
  5. Comparta esta imagen con otra aplicación usando la intención.
    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    
  6. Por el bien de este artículo, seleccionaremos Gmail y enviaremos esta imagen como un archivo adjunto en un correo.
    startActivity(Intent.createChooser(emailIntent, "Send mail..."));
    

A continuación se muestra la implementación completa del enfoque anterior:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
  
    <!--Textview with title "Camera_Demo!" is given by  -->     
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Camera Demo!"
        android:id="@+id/tv"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"
        />
  
    <!-- Add button to take a picture--> 
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv"
        android:layout_marginTop="50dp"
        android:text="Take Picture"
        android:textSize="20sp"
        android:textStyle="bold" />
  
    <!-- Add ImageView to display the captured image--> 
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView1"
        android:layout_below="@id/button1"
        />
</RelativeLayout>

MainActivity.java

package com.example.camera_mail;
  
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
  
import java.io.File;
  
public class MainActivity
    extends AppCompatActivity
    implements View.OnClickListener {
  
    private static final int
        CAMERA_PIC_REQUEST
        = 1337;
    private static final int
        REQUEST_EXTERNAL_STORAGE_RESULT
        = 1;
    private static final String
        FILE_NAME
        = "image01.jpg";
  
    private Button b1;
    private ImageView img1;
  
    File pictureDir
        = new File(
            Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES),
            "CameraDemo");
    private Uri fileUri;
  
    // The onCreate() method
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        b1 = (Button)findViewById(R.id.button1);
        img1 = (ImageView)findViewById(R.id.imageView1);
        b1.setOnClickListener(this);
        if (!pictureDir.exists()) {
            pictureDir.mkdirs();
        }
    }
  
    // Open the camera app to capture the image
    public void callCameraApp()
    {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File image = new File(pictureDir, FILE_NAME);
        fileUri = Uri.fromFile(image);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(intent, CAMERA_PIC_REQUEST);
    }
  
    public void onClick(View arg0)
    {
        if (
            ContextCompat.checkSelfPermission(
                this,
                Manifest
                    .permission
                    .WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
  
            callCameraApp();
        }
        else {
            if (
                ActivityCompat
                    .shouldShowRequestPermissionRationale(
                        this,
                        Manifest
                            .permission
                            .WRITE_EXTERNAL_STORAGE)) {
                Toast.makeText(
                         this,
                         "External storage permission"
                             + " required to save images",
                         Toast.LENGTH_SHORT)
                    .show();
            }
  
            ActivityCompat
                .requestPermissions(
                    this,
                    new String[] {
                        Manifest
                            .permission
                            .WRITE_EXTERNAL_STORAGE },
                    REQUEST_EXTERNAL_STORAGE_RESULT);
        }
    }
  
    protected void onActivityResult(int requestCode,
                                    int resultCode,
                                    Intent data)
    {
  
        if (requestCode == CAMERA_PIC_REQUEST
            && resultCode == RESULT_OK) {
            ImageView imageView
                = (android.widget.ImageView)
                    findViewById(R.id.imageView1);
  
            File image = new File(pictureDir, FILE_NAME);
            fileUri = Uri.fromFile(image);
            imageView.setImageURI(fileUri);
            emailPicture();
        }
        else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(
                     this,
                     "You did not click the photo",
                     Toast.LENGTH_SHORT)
                .show();
        }
    }
  
    @Override
    public void onRequestPermissionsResult(
        int requestCode,
        String[] permissions,
        int[] grantResults)
    {
  
        if (requestCode == REQUEST_EXTERNAL_STORAGE_RESULT) {
            if (grantResults[0]
                == PackageManager.PERMISSION_GRANTED) {
                callCameraApp();
            }
            else {
                Toast.makeText(
                         this, "External write permission"
                                   + " has not been granted, "
                                   + " cannot saved images",
                         Toast.LENGTH_SHORT)
                    .show();
            }
        }
        else {
            super.onRequestPermissionsResult(
                requestCode,
                permissions,
                grantResults);
        }
    }
  
    // Function to send the image through mail
    public void emailPicture()
    {
        Toast.makeText(
                 this,
                 "Now, sending the mail",
                 Toast.LENGTH_LONG)
            .show();
  
        Intent emailIntent
            = new Intent(
                android.content.Intent.ACTION_SEND);
        emailIntent.setType("application/image");
  
        emailIntent.putExtra(
            android.content.Intent.EXTRA_EMAIL,
            new String[] {
  
                // default receiver id
                "enquiry@geeksforgeeks.org" });
  
        // Subject of the mail
        emailIntent.putExtra(
            android.content.Intent.EXTRA_SUBJECT,
            "New photo");
  
        // Body of the mail
        emailIntent.putExtra(
            android.content.Intent.EXTRA_TEXT,
            "Here's a captured image");
  
        // Set the location of the image file
        // to be added as an attachment
        emailIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
  
        // Start the email activity
        // to with the prefilled information
        startActivity(
            Intent.createChooser(emailIntent,
                                 "Send mail..."));
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.camera_mail">
  
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    />
  
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
  
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  
</manifest>
  1. Inicie la aplicación
    UI of App

    Inicie la aplicación

  2. capturar la imagen
    image clicked and giving two options to user

    Imagen capturada y dos opciones dadas al usuario

  3. Seleccione la aplicación para compartir la imagen capturada. Aquí se selecciona GMail
  4. Enviar la imagen capturada por correo

    Enviar la imagen capturada por correo

  5. Imagen recibida

    Imagen recibida por correo

Publicación traducida automáticamente

Artículo escrito por AnshulVaidya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *