در اندروید شما به دو روشی که در پایین ذکر کرده ایم می توانید از دوربین یا 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>
بعد از این که پروژه را اجرا کردید در اولین صفحه می توانید دوربین را ببینید مانند تصویر بالا. بعد از اینکه تصویر خود را بگیرید و انتخاب آن تصویر را نهایی کنید, یک Bitmap به عنوان نتیجه درخواست برای شما در متد onActivityResult در دسترس خواهد بود.