استفاده از دوربین یا Camera در برنامه نویسی اندروید

در اندروید شما به دو روشی که در پایین ذکر کرده ایم می توانید از دوربین یا Camera در اپلیکیشن های خودتان استفاده کنید:

  • استفاده از یکی از اپلیکیشن های نصب شده بر روی تلفن که از دوربین استفاده میکند.
  • استفاده از API های دوربین که برای اندروید فراهم شده است.

استفاده از یک اپلیکیشن دوربین

برای اجرای یکی از اپلیکیشن های نصب شده بر روی تلفن که از دوربین استفاده می کنید باید از MediaStore.ACTION_IMAGE_CAPTURE استفاده کنید. به این شکل :

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

Intent های بیشتر MediaStore

علاوه بر مورد بالا در کلاس MediaStore می توان به Intent های دیگری نیز اشاره که کرد که در پایین لیست این موارد را ذکر کرده ایم :

نوع Intent و توضیحات آن ردیف
ACTION_IMAGE_CAPTURE_SECURE

هنگامی که دستگاه ایمن باشد، تصویر گرفته شده از دوربین را برمی گرداند.

1
ACTION_VIDEO_CAPTURE

این نوع Intent یکی از اپلیکیشن های که ویدیو ضبط می کند را اجرا میکند تا یک ویدیو ضبط کند و آن را برگرداند.

2
EXTRA_SCREEN_ORIENTATION

برای تنظیم جهت صفحه به صورت عمودی یا افقی استفاده می شود.

3
EXTRA_FULL_SCREEN

برای کنترل رابط کاربری ViewImage استفاده می شود.

4
INTENT_ACTION_VIDEO_CAMERA

این Intent برای راه اندازی دوربین در حالت فیلمبرداری استفاده می شود.

5
EXTRA_SIZE_LIMIT

برای تعیین محدودیت حجم ویدیو یا تصویر استفاده می شود.

6

 

اکنون از تابع startActivityForResult() برای راه اندازی این اکتیویتی استفاده کرده و منتظر نتیجه آن بمانید. به این شکل :

startActivityForResult(intent,0)

برخی از متد های درخواست

این روش در کلاس Activity تعریف شده است. ما آن را از اکتیویتی اصلی فراخوانی می کنیم. متدهایی در کلاس اکتیویتی تعریف شده‌اند که کار مشابهی را انجام می‌دهند، اما زمانی استفاده می‌شوند که از اکتیویتی آن ها را فرا خوانی نمی‌کنید، بلکه از جای دیگری آن ها را فراخوانی می‌کنید. این متد ها در پایین لیست شده اند :

متد و توضیحات ردیف
startActivityForResult(Intent intent, int requestCode, Bundle options)

اکتیویتی را شروع می‌کند، اما می‌تواند گزینه‌های بیشتری را با خود همراه کند.

1
startActivityFromChild(Activity child, Intent intent, int requestCode)

وقتی اکیتویتی شما فرزند هر اکتیویتی دیگری باشد، یک اکتیویتی را راه اندازی می کند.

2
startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options)

مانند بالا کار می کند، اما می تواند مقادیر اضافی را به شکل بسته نرم افزاری با خود بگیرد.

3
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)

اکتیویتی را از فرگمنتی که در حال حاضر در آن هستید راه اندازی می کند.

4
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options)

نه تنها اکتیویتی را از فرگمنت راه اندازی می کند، بلکه می تواند مقادیر اضافی را نیز با آن ببرد.

5

مهم نیست از کدام تابع برای راه اندازی اکتیویتی استفاده کرده اید, همه اینها یک نتیجه را بر میگردانند. نتیجه دریافتی را می توان در تابع onActivityResult  دریافت کرد.

مثال

در این مثال ما نحوه اجرا کردن یکی از برنامه های نصب شده بر روی تلفن که از دوربین استفاده میکند را آموزش داده ایم و بعد از آن که تصویر توسط کاربر انتخاب شد یک Bitmap در نتیجه برگشت داده میشود.

برای آزمایش این مثال، باید آن را روی دستگاه واقعی که دوربین روی آن پشتیبانی می‌شود اجرا کنید البته بر روی شبیه ساز هم این کار امکان پذیر است ولی بر روی برخی از نسخه ها با خطاهایی ممکن است رو به رو شوید.

توضیحات ردیف
بر روی اندروید استودیو یک پروژه جدید با پکیج نیم دلخواه ایجاد کنید. 1
کد های فایل ActivityMain.java را مطابق کد های که در پایین آورده ایم تغییر بدهید. 2
کد های فایل activity_main.xml را مطابق کد های که در پایین آورده ایم تغییر بدهید. 3
مجوز های موجود در فایل AndroidManifest.xml را اضافه کنید. 4

کد های فایل MainActivity.java

package com.foray.articlelib;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
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 androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

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) {

                // ابتدا باید یک توضیح نمایش بدیم
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.CAMERA)) {
                    showAlert();
                } else {
                    // توضیحی نیاز نیست نمایش بدیم, الان می تونیم درخواست مجوز رو بدیم
                    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.apply();
    }

    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("هشدار");
        alertDialog.setMessage("برنامه نیاز داره تا به دوربین دسترسی داشته باشه.");

        alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "رد کن",
                (dialog, which) -> {
                    dialog.dismiss();
                    finish();
                });

        alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "اجازه بده",
                (dialog, 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("هشدار");
        alertDialog.setMessage("اپ نیاز دار تا به دوربین دسترسی داشته باشه.");

        alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "رد کن",
                (dialog, which) -> {
                    dialog.dismiss();
                    //finish();
                });

        alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "تنظیمات",
                (dialog, which) -> {
                    dialog.dismiss();
                    startInstalledAppDetailsActivity(MainActivity.this);
                });

        alertDialog.show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 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 {
                        saveToPreferences(MainActivity.this, ALLOW_KEY, true);
                    }
                }
            }
        }
    }

    @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);
    }
}

کد های فایل activity_main.xml

<?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:padding="32dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:text="باز کردن دوربین"
        android:textSize="30dp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="7cloner.com"
        android:textColor="@color/black"
        android:textSize="35dp" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="250dp"
        android:layout_below="@+id/textView2"
        android:layout_alignStart="@+id/textView2"
        android:layout_alignLeft="@+id/textView2"
        android:layout_alignEnd="@+id/textView2"
        android:layout_alignRight="@+id/textView2"
        android:src="@drawable/abc" />

</RelativeLayout>

کد های AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.foray.articlelib">

    <uses-permission android:name="android.permission.CAMERA" />

    <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/Theme.ArticleLib">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

استفاده از دوربین یا Camera در برنامه نویسی اندروید

بعد از این که پروژه را اجرا کردید در اولین صفحه می توانید دوربین را ببینید مانند تصویر بالا. بعد از اینکه تصویر خود را بگیرید و انتخاب آن تصویر را نهایی کنید, یک Bitmap به عنوان نتیجه درخواست برای شما در متد onActivityResult در دسترس خواهد بود.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر نیاز است تا ابتدا وارد سایت شوید.

هیچ نظری ارسال نشده است.

قیمت آموزش
رایگان
نوع دسترسی
رایگان

این مقاله در حال حاضر تنها به روش رایگان در دسترس می باشد.

ناصر خالدی
مدرس دوره

ناصر خالدی

مهندس شبکه, امنیت, برنامه نویسی تلفن های هوشمند, طراح وب سایت و متخصص هوش مصنوعی

گفتگوی برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن

دوره های پیشنهادی

مقالات پیشنهادی

بک لینک چیست؟

بک لینک (Back Link) به لینک دادن یک سایت به سایت دیگر گفته میشود که یک فاکتور مهم و اساسی در سئو هر سایتی می باشد.


۹۹۴
۰
۲۲ آذر ۱۳۹۹

هک و امنیت

در تعریف کلی این واژه می توان گفت که به پیدا کردن راه های نفوذ به یک حریم شخصی و استفاده غیر مجاز از آن را هک می نامیم. هدف از هک می تواند ...


۹۶۰
۰
۱۳ آذر ۱۳۹۹

جاوا اسکریپت

جاوا اسکریپت یک زبان پویا و محبوب مبتنی بر شیء, داینامیک و مفسری می باشد. این زبان برای برنامه نویسی سمت سرور و کلاینت استفاده میشود که ...


۸۷۰
۰
۱۳ آذر ۱۳۹۹

درباره فایل Robots.txt

این فایل ربات های خزنده موتور های جستجو را راهنمایی می کنند و به آنان می فهماند که چه دایرکتوری و لینک هایی قابل بررسی و چه دایرکتوری و لینک هایی غیرقابل برررسی می باشند...


۷۵۶
۰
۲ دی ۱۳۹۹