对于小部件/关闭相机闪光灯在安卓开启闪光灯、部件、相机

2023-09-12 04:00:43 作者:Chafferer迷心

我正在开发一个小部件的开启/关闭摄像头LED的手机。

我已经可以工作像切换按钮(开/关)的Widget。

行为就像是如下:有时候LED灯仍然时启用的部件。 但它不列入打开/关闭摄像机为首但是它改变了图标

我无法弄清楚什么实际的问题。

同样的事情工作正常,在活动(手电筒应用程序)。

任何人能请解释一下我怎样才能解决我的问题?

我要去的地方错了?

您可以看一下下面的code我目前所做

的onupdate 方法

  @覆盖
    公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,
            INT [] appWidgetIds){

         //super.onUpdate(context,appWidgetManager,appWidgetIds);

        remoteViews =新RemoteViews(context.getPackageName(),R.layout.widgetlayout);
        watchWidget =新的组件名(背景下,FlashLightWidget.class);

        意图int​​entClick =新的意图(背景下,FlashLightWidget.class);
        intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,+ appWidgetIds [0]);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(上下文,appWidgetIds [0],intentClick,0);
        remoteViews.setOnClickPendingIntent(R.id.myToggleWidget,pendingIntent);
        appWidgetManager.updateAppWidget(watchWidget,remoteViews);
        CTX =背景;
    }
 

的onReceive 方法如下:

  @覆盖

    公共无效的onReceive(上下文的背景下,意图意图){
        // TODO自动生成方法存根

        remoteViews =新RemoteViews(context.getPackageName(),R.layout.widgetlayout);
        如果(intent.getAction()== NULL){
            捆绑额外= intent.getExtras();
            如果(临时演员!= NULL){
                 如果(状态)
                    {
                        状态= FALSE;
                        remoteViews.setImageViewResource(R.id.myToggleWidget,R.drawable.shutdown1);
                        processOnClick();
                        Toast.makeText(背景下,状态==假的onclick,Toast.LENGTH_SHORT).show();
                    }
                    其他
                    {
                        状态= TRUE;
                        remoteViews.setImageViewResource(R.id.myToggleWidget,R.drawable.shutdown2);
                        processOffClick();
                        Toast.makeText(背景下,状态==真 -  Ofclick,Toast.LENGTH_SHORT).show();
                    }
                }

                watchWidget =新的组件名(背景下,FlashLightWidget.class);

                (AppWidgetManager.getInstance(上下文))updateAppWidget(watchWidget,remoteViews);
           }
        }
  }
 
拍摄美化摄像软件 手机拍摄美化软件下载 乖乖手游网

processOffClick 方法

 私人无效processOffClick(){

        如果(mCamera!= NULL){
            mCamera.stop preVIEW();
            mCamera.set previewCallback(空);
            mCamera.release();
            mCamera = NULL;
        }
    }
 

processOnClick 方法

 私人无效processOnClick(){

    如果(mCamera == NULL)
    {
        尝试 {
            mCamera = Camera.open();
        }赶上(例外五){
            e.printStackTrace();
        }
    }
    如果(mCamera!= NULL){

        参数PARAMS = mCamera.getParameters();
        名单<字符串> flashModes = params.getSupportedFlashModes();

        如果(flashModes == NULL){
            返回;
        } 其他 {

                params.setFlashMode(Parameters.FLASH_MODE_OFF);
                mCamera.setParameters(PARAMS);
                mCamera.start preVIEW();

            串flashMode = params.getFlashMode();

            如果(!Parameters.FLASH_MODE_TORCH.equals(flashMode)){

                如果(flashModes.contains(Parameters.FLASH_MODE_TORCH)){
                    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    mCamera.setParameters(PARAMS);

                }

            }
        }
    }否则,如果(mCamera == NULL){
        //Toast.makeText(ctx,相机没有发现,Toast.LENGTH_LONG).show();
        返回;
    }
}
 

解决方案

在很长一段时间,我有自由来解决这个问题。

下面是我做的。

FlashlightWidgetProvider 类:

 公共类FlashlightWidgetProvider扩展AppWidgetProvider {

        @覆盖
        公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,
                        INT [] appWidgetIds){

                意图接收器=新的意图(背景下,FlashlightWidgetReceiver.class);
                receiver.setAction(COM_FLASHLIGHT);
                receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,appWidgetIds);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(上下文,0,接收机,0);

                RemoteViews意见=新RemoteViews(context.getPackageName()
                                R.layout.widget_layout);
                views.setOnClickPendingIntent(R.id.button,pendingIntent);

                appWidgetManager.updateAppWidget(appWidgetIds,意见);

        }
}
 

和BroadcastReceiver的为FlashlightWidgetReceiver:

 公共类FlashlightWidgetReceiver扩展的BroadcastReceiver {
            私有静态布尔isLightOn = FALSE;
            私有静态摄像头摄像头;

            @覆盖
            公共无效的onReceive(上下文的背景下,意图意图){
                    RemoteViews意见=新RemoteViews(context.getPackageName(),R.layout.widget_layout);

                    如果(isLightOn){
                            views.setImageViewResource(R.id.button,R.drawable.off);
                    } 其他 {
                            views.setImageViewResource(R.id.button,R.drawable.on);
                    }

                    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(上下文);
                    appWidgetManager.updateAppWidget(新的组件名(背景下,FlashlightWidgetProvider.class)
                                                                                     意见);

                    如果(isLightOn){
                            如果(相机!= NULL){
                                    camera.stop preVIEW();
                                    camera.release();
                                    摄像头= NULL;
                                    isLightOn = FALSE;
                            }

                    } 其他 {
                            //打开默认即面对镜头第一后部。
                            相机= Camera.open();

                            如果(相机== NULL){
                                    Toast.makeText(上下文,R.string.no_camera,Toast.LENGTH_SHORT).show();
                            } 其他 {
                                    //设置火炬闪光模式
                                    参数参数= camera.getParameters();
                                    param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                                    尝试 {
                                            camera.setParameters(参数);
                                            camera.start preVIEW();
                                            isLightOn = TRUE;
                                    }赶上(例外五){
                                            Toast.makeText(上下文,R.string.no_flash,Toast.LENGTH_SHORT).show();
                                    }
                            }
                    }
            }
    }
 

的Manifest.xml 要求

许可文件:

 <使用-权限的Andr​​oid:名称=android.permission.CAMERA>< /使用-许可>
 

另外注册在的Manifest.xml 接收文件:

 <接收机器人:名称=机器人:图标=@可绘制/对机器人FlashlightWidgetProvider。标签=@字符串/ APP_NAME>
         <意向滤光器>
            <作用机器人:名称=android.appwidget.action.APPWIDGET_UPDATE/>
         &所述; /意图滤光器>

         <元数据的android:NAME =android.appwidget.provider
                        机器人:资源=@ XML / flashlight_appwidget_info/>
< /接收器>

<接收器的Andr​​oid版本:NAME =FlashlightWidgetReceiver>
        <意向滤光器>
               <作用机器人:名称=COM_FLASHLIGHT>< /作用>
        &所述; /意图滤光器>
 < /接收器>
 

重要提示:此code工作完美的,如果你的手机有 FLASH_MODE_TORCH 支持。

我在三星Galaxy王牌2.2.1与放大器已经测试; 2.3.3。在code不工作,因为该设备没有FLASH_MODE_TORCH。

在HTC莎莎,野火工作正常。

如果任何人都可以在这里进行测试和后期结果,这将是最好的。

I am developing a widget for turning on/off camera led of phone.

I have made a widget that can work like toggle button (on/off).

Behavior is like follows : Sometimes the led light remains on when i enable the widget. But it doesnot turn on/off the camera led but it changes the icon.

I am not able to figure out whats the actual problem.

The same thing works fine in Activity (Torch Light Application).

Can anyone please explain me how can i solve my problem ?

Where i am going wrong ?

You can look at the code below that i have done so far

onUpdate method

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

         //super.onUpdate(context, appWidgetManager, appWidgetIds);

        remoteViews = new RemoteViews( context.getPackageName(), R.layout.widgetlayout);
        watchWidget = new ComponentName( context, FlashLightWidget.class );

        Intent intentClick = new Intent(context,FlashLightWidget.class);
        intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, ""+appWidgetIds[0]);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0],intentClick, 0);
        remoteViews.setOnClickPendingIntent(R.id.myToggleWidget, pendingIntent);
        appWidgetManager.updateAppWidget( watchWidget, remoteViews );
        ctx=context;      
    }

onReceive method is as follows :

@Override

    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        remoteViews = new RemoteViews( context.getPackageName(), R.layout.widgetlayout);
        if (intent.getAction()==null) {
            Bundle extras = intent.getExtras();
            if(extras!=null) {
                 if(status)
                    {
                        status=false;
                        remoteViews.setImageViewResource(R.id.myToggleWidget, R.drawable.shutdown1);
                        processOnClick();
                        Toast.makeText(context,"Status==false-onclick",Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        status = true;
                        remoteViews.setImageViewResource(R.id.myToggleWidget, R.drawable.shutdown2);
                        processOffClick();
                        Toast.makeText(context,"Status==true--Ofclick",Toast.LENGTH_SHORT).show();
                    }
                }

                watchWidget = new ComponentName( context, FlashLightWidget.class );

                (AppWidgetManager.getInstance(context)).updateAppWidget( watchWidget, remoteViews );
           }
        }
  }

processOffClick method

private void processOffClick() {

        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.setPreviewCallback(null);
            mCamera.release();      
            mCamera = null;
        }
    }

processOnClick method

private void processOnClick() {

    if(mCamera==null)
    {
        try {
            mCamera = Camera.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    if (mCamera != null) {

        Parameters params = mCamera.getParameters();
        List<String> flashModes = params.getSupportedFlashModes();

        if (flashModes == null) {
            return;
        } else {

                params.setFlashMode(Parameters.FLASH_MODE_OFF);
                mCamera.setParameters(params);
                mCamera.startPreview();

            String flashMode = params.getFlashMode();

            if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {

                if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
                    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    mCamera.setParameters(params);

                } 

            }
        }
    } else if (mCamera == null) {
        //Toast.makeText(ctx, "Camera not found", Toast.LENGTH_LONG).show();
        return;
    }
}

解决方案

After a long time, I got free to solve this problem.

Here is what I did.

FlashlightWidgetProvider class :

public class FlashlightWidgetProvider extends AppWidgetProvider {

        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                        int[] appWidgetIds) {

                Intent receiver = new Intent(context, FlashlightWidgetReceiver.class);
                receiver.setAction("COM_FLASHLIGHT");
                receiver.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, 0);

                RemoteViews views = new RemoteViews(context.getPackageName(),
                                R.layout.widget_layout);
                views.setOnClickPendingIntent(R.id.button, pendingIntent);

                appWidgetManager.updateAppWidget(appWidgetIds, views);

        }
}

and BroadcastReceiver for FlashlightWidgetReceiver :

public class FlashlightWidgetReceiver extends BroadcastReceiver {
            private static boolean isLightOn = false;
            private static Camera camera;

            @Override
            public void onReceive(Context context, Intent intent) {
                    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

                    if(isLightOn) {
                            views.setImageViewResource(R.id.button, R.drawable.off);
                    } else {
                            views.setImageViewResource(R.id.button, R.drawable.on);
                    }

                    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
                    appWidgetManager.updateAppWidget(new ComponentName(context,     FlashlightWidgetProvider.class),
                                                                                     views);

                    if (isLightOn) {
                            if (camera != null) {
                                    camera.stopPreview();
                                    camera.release();
                                    camera = null;
                                    isLightOn = false;
                            }

                    } else {
                            // Open the default i.e. the first rear facing camera.
                            camera = Camera.open();

                            if(camera == null) {
                                    Toast.makeText(context, R.string.no_camera, Toast.LENGTH_SHORT).show();
                            } else {
                                    // Set the torch flash mode
                                    Parameters param = camera.getParameters();
                                    param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                                    try {
                                            camera.setParameters(param);
                                            camera.startPreview();
                                            isLightOn = true;
                                    } catch (Exception e) {
                                            Toast.makeText(context, R.string.no_flash, Toast.LENGTH_SHORT).show();
                                    }
                            }
                    }
            }
    }

Permission required in Manifest.xml file :

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

Also register receivers in Manifest.xml file :

<receiver android:name=".FlashlightWidgetProvider" android:icon="@drawable/on" android:label="@string/app_name">
         <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
         </intent-filter>

         <meta-data android:name="android.appwidget.provider"
                        android:resource="@xml/flashlight_appwidget_info" />
</receiver>

<receiver android:name="FlashlightWidgetReceiver">
        <intent-filter>
               <action android:name="COM_FLASHLIGHT"></action>
        </intent-filter>
 </receiver>

Important Note : This code works perfect if your phone has FLASH_MODE_TORCH supported.

I have tested in Samsung Galaxy Ace 2.2.1 & 2.3.3. The code is not working because that device has no FLASH_MODE_TORCH.

Works fine in HTC Salsa, Wildfire..

If anyone can test and post results here, it would be best.