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:
- 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.
- Aquí pictureDir(File) apunta al directorio de almacenamiento externo llamado DIRECTORY_PICTURES
File pictureDir = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "CameraDemo");
- 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(); }
- 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()
- Comparta esta imagen con otra aplicación usando la intención.
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
- 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>
- Inicie la aplicación
- capturar la imagen
- Seleccione la aplicación para compartir la imagen capturada. Aquí se selecciona GMail
- Enviar la imagen capturada por correo
- Imagen recibida
Publicación traducida automáticamente
Artículo escrito por AnshulVaidya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA