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: