Android - Cámara
Estas son las dos formas siguientes, en las que puede utilizar la cámara en su aplicación
Usando la aplicación de cámara de Android existente en nuestra aplicación
Usando directamente la API de la cámara proporcionada por Android en nuestra aplicación
Usando la aplicación de cámara de Android existente en nuestra aplicación
Utilizará MediaStore.ACTION_IMAGE_CAPTURE para iniciar una aplicación de cámara existente instalada en su teléfono. Su sintaxis se da a continuación
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Aparte de lo anterior, hay otros Intents disponibles proporcionados por MediaStore. Se enumeran de la siguiente manera
No Señor | Tipo de intención y descripción |
---|---|
1 |
ACTION_IMAGE_CAPTURE_SECURE Devuelve la imagen capturada por la cámara, cuando el dispositivo está asegurado |
2 |
ACTION_VIDEO_CAPTURE Llama a la aplicación de video existente en Android para capturar video |
3 |
EXTRA_SCREEN_ORIENTATION Se utiliza para establecer la orientación de la pantalla en vertical u horizontal. |
4 |
EXTRA_FULL_SCREEN Se utiliza para controlar la interfaz de usuario de ViewImage. |
5 |
INTENT_ACTION_VIDEO_CAMERA Esta intención se usa para iniciar la cámara en el modo de video |
6 |
EXTRA_SIZE_LIMIT Se utiliza para especificar el límite de tamaño del tamaño de captura de video o imagen. |
Ahora usará la función startActivityForResult () para iniciar esta actividad y esperar su resultado. Su sintaxis se da a continuación
startActivityForResult(intent,0)
Este método ha sido definido en el activityclase. Lo llamamos de actividad principal. Hay métodos definidos en la clase de actividad que hacen el mismo trabajo, pero se utilizan cuando no se llama desde la actividad sino desde otro lugar. Se enumeran a continuación
No Señor | Descripción de la función de actividad |
---|---|
1 |
startActivityForResult(Intent intent, int requestCode, Bundle options) Inicia una actividad, pero puede incluir un conjunto adicional de opciones |
2 |
startActivityFromChild(Activity child, Intent intent, int requestCode) Lanza la actividad cuando tu actividad es hija de cualquier otra actividad |
3 |
startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) Funciona igual que el anterior, pero puede tomar valores adicionales en forma de paquete con él |
4 |
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) Lanza actividad desde el fragmento en el que se encuentra actualmente. |
5 |
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) No solo lanza la actividad desde el fragmento, sino que también puede llevar valores adicionales. |
No importa qué función utilizó para iniciar la actividad, todas devuelven el resultado. El resultado se puede obtener anulando la función onActivityResult .
Ejemplo
A continuación, se muestra un ejemplo que muestra cómo iniciar la aplicación de cámara existente para capturar una imagen y mostrar el resultado en forma de mapa de bits.
Para experimentar con este ejemplo, debe ejecutarlo en un dispositivo real en el que se admita la cámara.
Pasos | Descripción |
---|---|
1 | Utilizará Android Studio IDE para crear una aplicación de Android y nombrarla Cámara en una aplicación com.example.sairamkrishna.mya. |
2 | Modifique el archivo src / MainActivity.java para agregar un código de intención para iniciar la cámara. |
3 | Modificar el archivo XML de diseño res / layout / activity_main.xml |
4 | Agregue el permiso de la cámara y ejecute la aplicación y elija un dispositivo Android en ejecución e instale la aplicación en él y verifique los resultados. |
A continuación se muestra el contenido del archivo de actividad principal modificado src/MainActivity.java.
package com.example.sairamkrishna.myapplication;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
public static final int MY_PERMISSIONS_REQUEST_CAMERA = 100;
public static final String ALLOW_KEY = "ALLOWED";
public static final String CAMERA_PREF = "camera_pref";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (getFromPref(this, ALLOW_KEY)) {
showSettingsAlert();
} else if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
showAlert();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
}
} else {
openCamera();
}
}
public static void saveToPreferences(Context context, String key, Boolean allowed) {
SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = myPrefs.edit();
prefsEditor.putBoolean(key, allowed);
prefsEditor.commit();
}
public static Boolean getFromPref(Context context, String key) {
SharedPreferences myPrefs = context.getSharedPreferences(CAMERA_PREF,
Context.MODE_PRIVATE);
return (myPrefs.getBoolean(key, false));
}
private void showAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");
alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
});
alertDialog.show();
}
private void showSettingsAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage("App needs to access the Camera.");
alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "DONT ALLOW",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "SETTINGS",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
startInstalledAppDetailsActivity(MainActivity.this);
}
});
alertDialog.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
boolean
showRationale =
ActivityCompat.shouldShowRequestPermissionRationale(
this, permission);
if (showRationale) {
showAlert();
} else if (!showRationale) {
// user denied flagging NEVER ASK AGAIN
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
saveToPreferences(MainActivity.this, ALLOW_KEY, true);
}
}
}
}
// other 'case' lines to check for other
// permissions this app might request
}
}
@Override
protected void onResume() {
super.onResume();
}
public static void startInstalledAppDetailsActivity(final Activity context) {
if (context == null) {
return;
}
final Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
}
private void openCamera() {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(intent);
}
}
A continuación se mostrará el contenido de res/layout/activity_main.xml file-
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
</RelativeLayout>
A continuación se mostrará el contenido de res/values/strings.xml para definir una nueva constante
<resources>
<string name="app_name">My Application</string>
</resources>
A continuación se muestra el contenido predeterminado de AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sairamkrishna.myapplication.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Intentemos ejecutar su aplicación. Supongo que ha conectado su dispositivo móvil Android real con su computadora. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar en la barra de herramientas. Antes de iniciar su aplicación, Android Studio mostrará la siguiente ventana para seleccionar una opción donde desea ejecutar su aplicación de Android.
Seleccione su dispositivo móvil como una opción y luego verifique su dispositivo móvil que abrirá la cámara y mostrará la siguiente pantalla: