استفاده از Widget چراغ قوه در اندروید

دوشنبه 23 آذر 1394

در این مقاله قصد داریم در مورد ابزار چراغ قوه صحبت نماییم، و اینکه چگونه می توانیم یک ویجت برای چراغ قوه ی خود بسازیم.

استفاده از Widget چراغ قوه در اندروید

سیستم عامل اندروید api هایی را برای استفاده از چراغ قوه استفاده کرده اند.

در این مقاله  به برنامه نویسی اندروید برای Api دوربین و یک دید کلی کوچک به برنامه نویسی برنامه های کاربردی  اندروید و استفاده از ویجت مورد بحث است.

اگر چه این نوع از نرم افزار بسیار اساسی و مستقیم و رو به جلو است ولی به شما یک ایده ی اساسی برای استفاده از api های دوربین در دستگاه ها ارائه شده است.

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

چراغ قوه همراه با دوربین در یک دستگاه اندروید است، ولی بدان معنی است که شما نمی توانید به طور جداگانه از چراغ قوه استفاده نمایید، و باید شما از یک دوربین استفاده نمایید.

برای استفاده از دوربین باید package که برای دوربین است به نام android.hardware  بر روی گوشی ها باشد.

که برای اتصال به دوربین های عرضه شده را به ما می دهد.

مانند تمام فرآیند های دیگر ما اول نیاز به راه اندازی مجوز برای استفاده از ابزار ها را داریم.

بدون مجوز دسترسی به ابزار غیر ممکن خواهد بود بنابر این باید مجوز دسترسی را در androidmanifest قرار دهیم.

<uses-permission android:name="android.permission.FLASHLIGHT" android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" android:protectionLevel="normal" />  
<uses-permission android:name="android.permission.CAMERA" />  
<uses-permission android:name="android.hardware.camera.flash" />  
<uses-feature android:name="android.hardware.camera" android:required="false" />  
<uses-feature android:name="android.hardware.camera.flash" android:required="false" /> 

یک نکته ی جالب این است که همه چیز با یک دوربین و توسط یک دوربین کنترل می شود، با این حال ما نیاز به استفاده از هر جز از جمله چراغ قوه را داریم، اگر فقط مجوز های گوشی را بگذاریم به خطای Runtime Exception بر می خوریم.

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

برای استفاده از چراغ قوه ی گوشی از مجوز های زیر استفاده نمایید.

<Button  
style="?android:attr/buttonStyleSmall"  
android:layout_width="wrap_content"  
android:layout_height="wrap_content"  
android:text="@string/turn_on_string"  
android:id="@+id/turn_on_button"  
android:layout_alignParentBottom="true"  
android:layout_centerHorizontal="true"/> 

این سطح دسترسی استفاده ی شما برای چراغ قوه تا هر زمانی که نیاز داشته باشید را فراهم می کند.

حالا کلاس جاوا اول کلاس mainActivity که در این کلاس از یک دکمه استفاده می کنیم که برای روشن و خاموش کردن

چراغ قوه استفاده خواهد شد.

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

داخل لایه ی activity از یک دکمه و یک متن استفاده شده است:

<Button  
style="?android:attr/buttonStyleSmall"  
android:layout_width="wrap_content"  
android:layout_height="wrap_content"  
android:text="@string/turn_on_string"  
android:id="@+id/turn_on_button"  
android:layout_alignParentBottom="true"  
android:layout_centerHorizontal="true"/> 

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

یک دکمه تعریف می کنید و برای آن یک رویداد می نویسید

که اگر چراغ قوه روشن بود خاموش شود و متن دکمه روشن نوشته شود، و اگر چراغ قوه خاموش بود روشن شود و متن دکمه خاموش نوشته شود.

// Find the button from the view.  
final Button button = (Button) findViewById(R.id.turn_on_button);  
// Attach the event handler  
button.setOnClickListener(new View.OnClickListener()  
{  
    @Override  
    public void onClick(View v)  
    {  
        // Create an intent (Empty at the point)  
        Intent serviceIntent = new Intent(getApplicationContext(), FlashlightIntentService.class);  
        if (button.getText().toString().equals(getString(R.string.turn_on_string)))  
        {  
            // Turn on the flashlight  
            serviceIntent.setAction(FlashlightIntentService.ACTION_TURN_ON);  
            startService(serviceIntent);  
            button.setText(R.string.turn_off_string);  
        }  
        else  
        {  
            // Turn off the flashlight  
            serviceIntent.setAction(FlashlightIntentService.ACTION_TURN_OFF);  
            startService(serviceIntent);  
            button.setText(R.string.turn_on_string);  
        }  
    }  
}); 

برای این نرم افزار تمام اقدامات ما به صورت زیر است :

1-روشن کردن چراغ قوه

2- خاموش کردن چراغ قوه

برای این دوعمل نیاز به نوشتن این دو action زیر است:

این اقدامات را به عنوان ساده و استاتیک به صورت یک رشته تعریف نماییم از این رشته بعدا می توان برای فعالیت های مختلف استفاده کرد

public static final String ACTION_TURN_ON = "com.wordpress.afzaalahmadzeeshan.flashlight_app.TURN_ON";  
public static final String ACTION_TURN_OFF = "com.wordpress.afzaalahmadzeeshan.flashlight_app.TURN_OFF"; 

هنگامی که برنامه اجرا می شود باید دستگاه چک شود که آیا به دوربین دسترسی دارد یا نه؟ چون ممکن است دوربین در دسترس نباشد و یا اینکه مجوز استفاده از دروبین نباشد و یا در حال استفاده از دوربین باشد.

بنابر این در مرحله ما از یک بلوک try استفاده می نماییم، بنابر این در تابع زیر دسترسی به دوربین را چک می کند و بعد

اگر متصل نبود به کاربر یک پیغام خطا می دهد.

    private void fillFields()  
    {  
        // Initialize the fields  
        canWork = this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);  

        // Get the IDs if any.  
        ids = AppWidgetManager.getInstance(this).getAppWidgetIds(new ComponentName(this, FlashLightWidget.class));  
        // If flash feature is available  
        if (canWork)  
        {  
            // Get the camera instance  
            if (camera == null)  
            {  
                // Only if the camera object is null. Otherwise,  
                // we may have captured the camera instance in last visit.  
                try  
                {  
                    camera = Camera.open(); // Try to open the camera  
                    // Set the properties.  
                    Camera.Parameters p = camera.getParameters();  
                    // Set it to flash mode  
                    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);  
                    camera.setParameters(p);  
                }  
                catch (Exception ignored)  
                {  
                    notifyUser();  
                }  
            }  
        }  
        else  
        {  
            // If flash is not available, notify the user  
            notifyUser();  
        }  
    }  

در بالا از یک تابع notify استفاده شده است که به کاربر اطلاع رسانی میکند.

این تابع اگر چراغ قوه در دسترس نیست یا اگر دوربین نمی تواند به نرم افزار متصل شود یک پیغام خطایی را به کاربران اطلاع می دهد.

private void notifyUser()  
{  
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_flash_on_white_24dp).setContentTitle("Cannot access flashlight").setContentText("Camera application may be running in a background application.");  
    int mId = 1234;  
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    // mId allows you to update the notification later on.  
    mNotificationManager.notify(mId, mBuilder.build());  
} 

در قدم بعدی مدیریت intent های مورد استفاده است که به صورت زیر خواهد بود:

@Override  
protected void onHandleIntent(Intent intent)  
{  
    // Fill the fields  
    fillFields();  
    // Handle the intent  
    if (intent.getAction().equals(ACTION_TURN_OFF))  
    {  
        alter(false);  
    }  
    else if (intent.getAction().equals(ACTION_TURN_ON))  
    {  
        alter(true);  
    }  
} 

در کنترولر intent تنها یک تابع است که یک مقدار بولی را قبول می کند، تابع به صورت زیر خواهد بود:

    private void alter(boolean on)  
    {  
        if (canWork)  
        {  
            if (on)  
            {  
                try  
                {  
                    // Start the "flashlight"  
                    camera.startPreview();  
                    FlashLightWidget.lightOn = true;  
                    notifyWidgets();  
                }  
                catch (Exception e)  
                {  
                    Toast.makeText(FlashlightIntentService.this, e.getMessage(), Toast.LENGTH_SHORT).show();  
                }  
            }  
            else  
            {  
                try  
                {  
                    // Stop everything and just release the resource  
                    camera.stopPreview();  
                    camera.release();  
                    camera = null;  
                    FlashLightWidget.lightOn = false;  
                    notifyWidgets();  
                }  
                catch (Exception e)  
                {  
                    Toast.makeText(FlashlightIntentService.this, e.getMessage(), Toast.LENGTH_SHORT).show();  
                }  
            }  
        }  
        else  
        {  
            notifyUser();  
        }  
    }  

در تابع بالا ما از یک متغییر bool استفاده می کنیم، که برای ما چک می کند که آیا دوربین بسته باشد یا فعال

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

حالا برای درست کردن این ویجت نیاز به یک activity دارید به صورت زیر :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
android:layout_width="match_parent"  
android:layout_height="match_parent"  
android:padding="@dimen/widget_margin">  
  
<ImageView  
   android:layout_width="wrap_content"  
   android:layout_height="wrap_content"  
   android:id="@+id/button_switch_widget"  
   android:layout_alignParentTop="true"  
   android:layout_alignParentLeft="true"  
   android:layout_alignParentStart="true"  
   android:layout_margin="15dp"/>    
</RelativeLayout> 

این فقط شامل یک imageview است که برای پیش نمایش تصویر ویجت ما استفاده خواهد شد.

کلاسی که برای استفاده از ویجت برای ما کار می کند، کلاس AppWidgetProvider این کلاس برای ما یک تابع پایه را ایجاد می کند که برای مدیریت کردن ایجاد ویجت های جدید و یا حذف شدن ویجت ها است.

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)  
    {  
        // Construct the RemoteViews object  
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.flash_light_widget);  
        if (lightOn)  
        {  
            // Flash light active  
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.light_active_45);  
            views.setImageViewBitmap(R.id.button_switch_widget, bitmap);  
            // Create the intent, set the action  
            Intent underlyingIntent = new Intent(context, FlashlightIntentService.class);  
            underlyingIntent.setAction(FlashlightIntentService.ACTION_TURN_OFF);  
            // Create the pending intent  
            PendingIntent turnOffIntent = PendingIntent.getService(context, 1, underlyingIntent, PendingIntent.FLAG_UPDATE_CURRENT);  
            views.setOnClickPendingIntent(R.id.button_switch_widget, turnOffIntent);  
        }  
        else  
        {  
            // Flash light off  
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.light_deactive_45);  
            views.setImageViewBitmap(R.id.button_switch_widget, bitmap);  
            // Create the intent, set the action  
            Intent underlyingIntent = new Intent(context, FlashlightIntentService.class);  
            underlyingIntent.setAction(FlashlightIntentService.ACTION_TURN_ON);  
            // Create the pending intent  
            PendingIntent turnOnIntent = PendingIntent.getService(context, 1, underlyingIntent, PendingIntent.FLAG_UPDATE_CURRENT);  
            views.setOnClickPendingIntent(R.id.button_switch_widget, turnOnIntent);  
        }  
        // Instruct the widget manager to update the widget  
        appWidgetManager.updateAppWidget(appWidgetId, views);  
    }  

اگر روی صفحه نمایش گوشی خود کلیک نمایید یک قسمت ویجت وجود دارد که شما می توانید آن را نصب نمایید

اگر روی گوشی خود ویجت را نصب نمایید به صورت زیر خواهد بود.

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

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

@Override  
public void onPause()  
{  
    if (FlashLightWidget.lightOn)  
    {  
        // Light is on, turn it off.  
        Intent intent = new Intent(this, FlashlightIntentService.class);  
        intent.setAction(FlashlightIntentService.ACTION_TURN_OFF);  
        startService(intent);  
    }  
    super.onPause();  
} 

که اگر روشن بود چراغ قوه را خاموش نماید.

خروجی به صورت زیر خواهد بود:

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید