【问题标题】:Flashlight widget does not turn off手电筒小部件不关闭
【发布时间】:2014-02-05 14:21:45
【问题描述】:

我已经创建了我的小部件存在和运行所需的一切。即便如此,在第一次点击时,t 会执行应有的操作,但随后图像会更改并显示问题,并且无法正常工作。我希望它打开闪光灯然后关闭它。 帮助将不胜感激。

FlashlightWidgetProvider

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.flash_widget);
               views.setOnClickPendingIntent(R.id.button, pendingIntent);

               appWidgetManager.updateAppWidget(appWidgetIds, views);

       }
}

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.flash_widget);

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

【问题讨论】:

  • 请非常仔细地解释它应该做什么,它正在做什么,以及它与它应该做什么有什么不同。在不知道它应该做什么的情况下,我们无能为力......
  • 听起来你说它崩溃了。如果是这种情况,请发布 logcat。
  • @codeMagic 好吧,小部件被创建并仅在第一次点击时工作,之后它说像加载小部件的问题应该是图像,所以基本上它不会关闭闪光灯那已经打开了。我想通过这个小部件打开和关闭手电筒。哦,还有.. 崩溃没有 logcat
  • 有人能帮帮我吗?
  • 如果有帮助,请查看我的回答并投票。

标签: android camera android-widget widget android-appwidget


【解决方案1】:

确保按钮资源引用 ImageView 而不是常规按钮。我刚开始在布局文件中使用 Button 进行了尝试,但遇到了同样的问题,小部件基本上会崩溃并从主屏幕中删除。当我在布局文件中将按钮更改为 ImageView 时,代码现在可以工作了。

我确实对你的代码做了一些修改,所以如果它本身不起作用,这里是更新后的 FlashlightWidgetProvider:

public class FlashlightWidgetProvider extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(intent.getAction())) {
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));

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

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

            appWidgetManager.updateAppWidget(appWidgetIds, views);
        }

        super.onReceive(context, intent);
    }
}

此外,请确保在清单中正确注册小部件提供者和接收者(当然,将相关部分替换为您自己的部分):

    <receiver
        android:name="com.example.stackoverflowtester.widget.FlashlightWidgetProvider"
        android:label="Flashlight" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/flashlight_widget_provider" />
    </receiver>
    <receiver android:name="com.example.stackoverflowtester.widget.FlashlightWidgetReceiver" >
        <intent-filter>
            <action android:name="COM_FLASHLIGHT" />
        </intent-filter>
    </receiver>

【讨论】:

  • 谢谢,就是这样!我必须承认我需要一段时间才能注意到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2014-06-17
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多