Android - Fotocamera
Questi sono i due modi seguenti in cui puoi usare la fotocamera nella tua applicazione
Utilizzo dell'applicazione della fotocamera Android esistente nella nostra applicazione
Utilizzando direttamente l'API della fotocamera fornita da Android nella nostra applicazione
Utilizzo dell'applicazione della fotocamera Android esistente nella nostra applicazione
Utilizzerai MediaStore.ACTION_IMAGE_CAPTURE per avviare un'applicazione della fotocamera esistente installata sul telefono. La sua sintassi è data di seguito
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Oltre a quanto sopra, ci sono altri Intent disponibili forniti da MediaStore. Sono elencati come segue
Suor n | Tipo di intento e descrizione |
---|---|
1 | ACTION_IMAGE_CAPTURE_SECURE Restituisce l'immagine catturata dalla fotocamera, quando il dispositivo è protetto |
2 | ACTION_VIDEO_CAPTURE Chiama l'applicazione video esistente in Android per acquisire video |
3 | EXTRA_SCREEN_ORIENTATION Viene utilizzato per impostare l'orientamento dello schermo su verticale o orizzontale |
4 | EXTRA_FULL_SCREEN Viene utilizzato per controllare l'interfaccia utente di ViewImage |
5 | INTENT_ACTION_VIDEO_CAMERA Questo intento viene utilizzato per avviare la fotocamera in modalità video |
6 | EXTRA_SIZE_LIMIT Viene utilizzato per specificare il limite di dimensione del video o la dimensione dell'acquisizione dell'immagine |
Ora utilizzerai la funzione startActivityForResult () per avviare questa attività e attendere il suo risultato. La sua sintassi è data di seguito
startActivityForResult(intent,0)
Questo metodo è stato definito in activityclasse. Lo chiamiamo dall'attività principale. Esistono metodi definiti nella classe di attività che svolgono lo stesso lavoro, ma vengono utilizzati quando non si chiama dall'attività ma da qualche altra parte. Sono elencati di seguito
Suor n | Descrizione della funzione dell'attività |
---|---|
1 | startActivityForResult(Intent intent, int requestCode, Bundle options) Avvia un'attività, ma può richiedere un pacchetto aggiuntivo di opzioni |
2 | startActivityFromChild(Activity child, Intent intent, int requestCode) Avvia l'attività quando la tua attività è figlia di qualsiasi altra attività |
3 | startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) Funziona come sopra, ma può assumere valori extra sotto forma di bundle con esso |
4 | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) Lancia l'attività dal frammento in cui ti trovi attualmente |
5 | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) Non solo avvia l'attività dal frammento, ma può portare con sé valori extra |
Indipendentemente dalla funzione utilizzata per avviare l'attività, restituiscono tutti il risultato. Il risultato può essere ottenuto sovrascrivendo la funzione onActivityResult .
Esempio
Di seguito è riportato un esempio che mostra come avviare l'applicazione della fotocamera esistente per acquisire un'immagine e visualizzare il risultato sotto forma di bitmap.
Per sperimentare questo esempio, è necessario eseguirlo su un dispositivo reale su cui è supportata la fotocamera.
Passi | Descrizione |
---|---|
1 | Utilizzerai l'IDE di Android Studio per creare un'applicazione Android e chiamarla Fotocamera in com.example.sairamkrishna.myapplication. |
2 | Modifica il file src / MainActivity.java per aggiungere il codice intent per avviare la fotocamera. |
3 | Modifica il file XML di layout res / layout / activity_main.xml |
4 | Aggiungi l'autorizzazione Fotocamera ed esegui l'applicazione e scegli un dispositivo Android in esecuzione, installa l'applicazione su di esso e verifica i risultati. |
Di seguito è riportato il contenuto del file di attività principale modificato 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);
}
}
Di seguito sarà il contenuto di 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>
Di seguito sarà il contenuto di res/values/strings.xml per definire una nuova costante
<resources>
<string name="app_name">My Application</string>
</resources>
Di seguito è riportato il contenuto predefinito di 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>
Proviamo a eseguire la tua applicazione. Presumo che tu abbia collegato il tuo dispositivo mobile Android effettivo al tuo computer. Per eseguire l'app da Android Studio, apri uno dei file di attività del tuo progetto e fai clic sull'icona Esegui dalla barra degli strumenti. Prima di avviare l'applicazione, Android Studio visualizzerà la seguente finestra per selezionare un'opzione in cui si desidera eseguire l'applicazione Android.
Seleziona il tuo dispositivo mobile come opzione, quindi controlla il tuo dispositivo mobile che aprirà la fotocamera e visualizzerà la seguente schermata: