【发布时间】:2011-11-22 20:08:04
【问题描述】:
我正在开发一个用于打开/关闭手机摄像头的小部件。
我制作了一个可以像切换按钮(开/关)一样工作的小部件。
行为如下:当我启用小部件时,有时 LED 灯仍然亮着。 但它不会打开/关闭摄像头指示灯,但会更改图标。
我无法弄清楚实际问题是什么。
同样的事情在 Activity(Torch Light 应用程序)中也能正常工作。
谁能解释一下我该如何解决我的问题?
我哪里出错了?
你可以看看下面我到目前为止所做的代码
onUpdate 方法
@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方法如下:
@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方法
private void processOffClick() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
}
processOnClick 方法
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;
}
}
【问题讨论】:
-
请参考这篇文章以获得有效的解决方案:stackoverflow.com/questions/3878294/…
-
@HandlerExploit :这对我没有帮助,伙计。我之前已经多次引用过它。我要问的是完全不同的。
-
如果我正在阅读您正在正确执行的操作...您似乎正在尝试从应用小部件提供商控制 LED,这是正确的吗?如果是这样,您需要提取该代码并将其放入自己的类中,然后从您的应用小部件提供程序调用该类
-
@DDoSAttack:是的,你是对的。我正在尝试控制来自应用小部件提供商的 LED。但我认为我在 AppWidgetProvider 中实现了错误的东西。我认为在 onReceive 方法中处理点击事件是不合适的!
-
没错。 AppWidgetProvider 的功能非常有限。您可以通过 RemoteViews developer.android.com/reference/android/widget/RemoteViews.html 访问布局小部件,因此我建议创建一个单独的类来处理所有 AppWidget UI 更新...这是我今天发布的一个简单示例:stackoverflow.com/questions/7560265/…
标签: android android-widget widget android-camera android-appwidget