با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. گاهی در بعضی از برنامه های کاربردی اندروید نیاز دارید که به دوربین دستگاه دسترسی پیدا کرده و از قابلیت های آن در اپلیکیشن خود استفاده کنید، اندروید به شما اجازه می دهد تا با کلاس ها و متدهای خاصی بتوانید به دوربین دستگاه اندروید مورد نظر دسترسی داشته باشید، با دوربین شما می توانید علاوه بر گرفتن عکس و فیلم در برنامه ، اقداماتی نظیر بارکد خوان ، تشخیص متن یا چهره و … را نیز انجام دهید، برای اشنایی بیشتر با چگونگی کار با دوربین در اندروید در ادامه ی مباحث این آموزش با ما همراه باشید.
در این مبحث ما شما را با ساختار و متدهای کار با دروبین و همچنین یک مثال ساده در این زمینه آشنا می کنیم.
به طور کلی دو راه برای استفاده از دوربین دستگاه در اپلیکیشن خود دارید:
ما از MediaStore.ACTION_IMAGE_CAPTURE برای اجرای اپلیکیشن دوربین نصب شده در تلفن همراه خود استفاده می کنیم.
ساختار استفاده از این روش به صورت زیر است:
1 | Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); |
به غیر از موارد فوق، موجودی های دیگر توسط MediaStore وجود دارد. آنها به شرح زیر هستند:
ردیف | نوع Intent و توضیحات مربوطه |
---|---|
۱ | ACTION_IMAGE_CAPTURE_SECURE این عکس گرفته شده توسط دوربین دستگاه را برمی گرداند. |
۲ | ACTION_VIDEO_CAPTURE video application اندروید را برای ضبط ویدئو فراخوانی می کند.
|
۳ | EXTRA_SCREEN_ORIENTATION این برای جهت گیری افقی و عمودی صفحه استفاده می شود. |
۴ | EXTRA_FULL_SCREEN این برای کنترل رابط کاربری ViewImage استفاده می شود. |
۵ | INTENT_ACTION_VIDEO_CAMERA این نوع برای تنظیم دوربین دستگاه در حالت ضبط ویدئو استفاده می شود. |
۶ | EXTRA_SIZE_LIMIT این نوع برای محدود کردن اندازه ی محدوده ی ضبط عکس یا ویدئو استفاده می شود. |
حالا باید از تابع ()startActivityForResult برای اجرای این activity و دریافت نتیجه استفاده کرد.
ساختار آن به این صورت است:
1 | startActivityForResult(intent,0) |
این متد در کلاس activity تعریف شده است و ما آن را از main activity فرخوانی می کنیم.
متد های تعریف شده ای در کلاس activity وجود دارد که کار مشابهی را انجام می دهد.
این متدها به شرح زیر است:
ردیف | تابع Activity و توضیحات مربوطه |
---|---|
۱ | startActivityForResult(Intent intent, int requestCode, Bundle options) این یک activity را شروع می کند، اما شما می توانید با این متد گزینه های بیشتری را نیز داشته باشید. |
۲ | startActivityFromChild(Activity child, Intent intent, int requestCode) این یک activity که زیر مجموعه ی سایر activity ها باشد را شروع می کند. |
۳ | startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options) این همانند متد بالا عمل می کند با این تفاوت که شامل گزینه های بیشتری در شکل می باشد. |
۴ | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) این activity را از یک فرگمنت اجرا می کند. |
۵ | startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options) این activity را از یک فرگمنت اجرا نمی کند اما اجازه می دهد که مقادیر اضافه تری را تنظیم کنید. |
برای دریافت نتیجه ی هر کدام از متدهای فوق می توانید نتیجه را با فراخوانی تابع onActivityResult بدست آورید.
در اینجا یک مثال است که چگونگی راه اندازی برنامه دوربین موجود برای ضبط یک تصویر و نمایش نتیجه در فرم bitmap را نشان می دهد.
نکته: برای تست این مثال شما باید از یک دستگاه اندروید واقعی که دوربین داشته باشد استفاده کنید.
مراحل انجام کار:
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کرده و نام پکیج را com.pvlearn.myapplication قرار بدهید. |
۲ | به محتوای فایل src/MainActivity.java کد intent مورد نیاز برای استفاده از دوربین را اضافه کنید. |
۳ | طراحی فایل res/layout/activity_main.xml مطابق با نیاز برنامه تغییر دهید. |
۴ | برنامه را اجرا کنید تا شبیه ساز اندروید نتیجه را نمایش دهد. |
محتوای فایل main activity در مسیر src/MainActivity.java به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | package com.example.Pvlearn.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); } } } } } } @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:
1 2 3 4 5 6 7 8 9 10 | <?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 :
1 2 3 | <resources> <string name="app_name">My Application</string> </resources> |
محتوای پیش فرض فایل AndroidManifest.xml :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Pvlearn.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.Pvlearn.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> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
سپس نتیجه اجرای برنامه را در دستگاه اندروید خود مشابه زیر مشاهده خواهید کرد.
در این پنجره شما باید محیط اجرای برنامه را بین شبیه ساز و دستگاه اندروید خود انتخاب کنید:
در پنجره ی فوق دستگاه موبایل خود را انتخاب کرده و سپس دوربین موبایل خود را باز کنید تا نتیجه ی زیر را مشاهده کنید:
یکی از قابلیت های دیگری که اندروید در اختیار شما قرار می دهد قابلیت دسترسی و مدیریت دوربین دستگاه اندروید از طریق اپلیکیشن شماست. این قابلیت در زمینه های بسیاری کاربرد دارد، از این رو مباحث این آموزش به آموزش کار با دوربین در اندروید اختصاص یافته است.