我正在开发一个小部件的开启/关闭摄像头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);
意图intentClick =新的意图(背景下,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
要求
许可文件:
<使用-权限的Android:名称=android.permission.CAMERA>< /使用-许可>
另外注册在的Manifest.xml
接收文件:
<接收机器人:名称=机器人:图标=@可绘制/对机器人FlashlightWidgetProvider。标签=@字符串/ APP_NAME>
<意向滤光器>
<作用机器人:名称=android.appwidget.action.APPWIDGET_UPDATE/>
&所述; /意图滤光器>
<元数据的android:NAME =android.appwidget.provider
机器人:资源=@ XML / flashlight_appwidget_info/>
< /接收器>
<接收器的Android版本: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.