Android 简明教程

Android - Camera

以下是在应用程序中使用相机的两种方法

  1. 使用应用程序中现有的 Android 相机应用程序

  2. 直接使用应用程序中 Android 提供的 Camera API

Using existing android camera application in our application

您将使用 MediaStore.ACTION_IMAGE_CAPTURE 启动已安装在手机上的现有相机应用程序。其语法如下所示

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

除了以上,还有其他 MediaStore 提供的可用意图。它们列举如下

Sr.No

Intent type and description

1

ACTION_IMAGE_CAPTURE_SECURE 设备安全时,它返回从摄像头捕捉的图像

2

ACTION_VIDEO_CAPTURE 它调用 android 中存在的视频应用程序来捕捉视频

3

EXTRA_SCREEN_ORIENTATION 它用来设置屏幕方向为垂直或横向

4

EXTRA_FULL_SCREEN 它用来控制 ViewImage 的用户界面

5

INTENT_ACTION_VIDEO_CAMERA 这种意图用来以视频模式启动摄像头

6

EXTRA_SIZE_LIMIT 它用来指定视频或图像捕捉大小的尺寸限制

现在您将使用 startActivityForResult() 函数来启动此活动并等待其结果。其语法如下:

startActivityForResult(intent,0)

该方法已在 activity 类中定义。我们从主活动调用它。活动类中定义了可执行相同作业的方法,但仅当您不是从活动调用而是从别处调用时才使用它们。它们如下所示:

Sr.No

Activity function description

1

startActivityForResult(Intent intent, int requestCode, Bundle options) 它启动一个活动,但可以随身携带额外的选项捆绑。

2

startActivityFromChild(Activity child, Intent intent, int requestCode) 当您的活动是其他任何活动的子活动时,将启动该活动

3

startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) 它与上面相同,但可以随身携带捆绑形状的额外值

4

startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) 从您当前所在的片段推出活动

5

startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) 它不仅从片段推出活动,还可以随身携带额外值

无论您使用哪种函数来启动活动,它们都会返回结果。可以通过覆盖 onActivityResult 函数来获取结果。

Example

以下是一个示例,展示如何启动现有相机应用程序来捕捉图像以及以位图形式显示结果。

要试验此示例,您需要在支持摄像头的实际设备上运行此示例。

Steps

Description

1

您将使用 Android Studio IDE 创建一个 Android 应用程序并将其命名为 Camera,位于 com.example.sairamkrishna.myapplication 下。

2

修改 src/MainActivity.java 文件,添加意图代码来启动相机。

3

修改布局 XML 文件 res/layout/activity_main.xml

4

添加摄像头权限并运行应用程序并选择一个运行的 android 设备并在其上安装应用程序并验证结果。

以下是修改后的主活动文件 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);
   }
}

以下是 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>

以下是 res/values/strings.xml 的内容,用于定义一个新常量

<resources>
   <string name="app_name">My Application</string>
</resources>

以下是 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>

让我们尝试运行您的应用程序。我假设您已将真实的 Android 移动设备与计算机连接。要从 Android 工作室运行应用程序,请打开一个项目的活动文件,并单击工具栏中的运行图标。在启动应用程序之前,Android 工作室将显示以下窗口选择您希望运行 Android 应用程序的选项。

choose device

选择您的移动设备作为选项,然后检查您的移动设备,它将打开摄像头并显示以下屏幕−

camera2