无法让安卓闪光灯小部件打开闪光灯

Posted

技术标签:

【中文标题】无法让安卓闪光灯小部件打开闪光灯【英文标题】:Can't get android flash light widget to turn flash on 【发布时间】:2013-02-27 11:17:06 【问题描述】:

我正在尝试为galaxy nexus 制作一个闪光灯小部件,并且已经被这个问题困扰了好几天。我有一个小部件,它由一个功能类似于切换的按钮组成。但我无法获得打开闪光灯的按钮。该小部件用作使用 toast 的切换,但是一旦我添加了与 flash 通信的代码行,它就会崩溃。因此,如果您只在每个 if 语句中留下 toast 代码,那么 toast 就可以工作。我知道我应该使用 SurfaceHolder.Callback,但我不知道如何在扩展 AppWidgetProvider 的类上实现它。如果有人可以查看我的代码并尝试帮助我制作这个小部件,我将不胜感激。我只是不知道如何使用 appwidgetprovider 类来实现这一点。

只有当我有这个错误时才会出现:

//TURN FLASH OFF
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.setParameters(p);
cam.stopPreview();

和:

//TURN FLASH ON
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);                    
cam.setParameters(p);
cam.startPreview();

如果我不将这些代码行放入,小部件运行时不会出现错误,并且只显示 toast。这意味着它访问 onReceive() 方法。

我正在使用银河系。

public class FlashWidget extends AppWidgetProvider 

Camera cam;
RemoteViews view;
private static final String ACTION_WIDGET_RECEIVER = "Action";
private static boolean isLightOn = false;



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

        final int n = appWidgetIds.length;
        view = new RemoteViews(context.getPackageName(), R.layout.widget_lay);

        for (int i = 0; i < n; i++)   
               int appWidgetId = appWidgetIds[i];  

               Intent intent = new Intent(context, FlashWidget.class);
               intent.setAction(ACTION_WIDGET_RECEIVER);

               PendingIntent pend = PendingIntent.getBroadcast(context, 0, intent, 0);

               view.setOnClickPendingIntent(R.id.button1, pend);


               appWidgetManager.updateAppWidget(appWidgetId, view);
        


    

    @Override
    public void onReceive(Context context, Intent intent) 

        String action =intent.getAction();

        if(intent.getAction().equals(action)) 


            //YES ITS ON, so turn it OFF
            if(isLightOn) 

                isLightOn = false;
                //TURN FLASH OFF
                Parameters p = cam.getParameters();
                p.setFlashMode(Parameters.FLASH_MODE_OFF);
                cam.setParameters(p);
                cam.stopPreview();
                Toast.makeText(context, "Flash OFF", Toast.LENGTH_SHORT).show();

            //NO ITS OFF, SO LETS TURN IT ON
             else 

                isLightOn = true;
                //TURN FLASH ON
                Parameters p = cam.getParameters();
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);

                cam.setParameters(p);
                cam.startPreview();
                Toast.makeText(context, "Flash ON", Toast.LENGTH_SHORT).show();

            

            super.onReceive(context, intent);

        


     

androidManifest.xml

<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />

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



<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.flash.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver 
        android:name=".FlashWidget"
        android:label="Flash">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            <action android:name="com.example.flash.ACTION_WIDGET_RECEIVER"/>
            <action android:name="android.appwidget.action.APPWIDGET_ENABLED"/>
        </intent-filter>
        <meta-data 
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_in"/>
   </receiver>
</application>

</manifest>

这是我尝试将小部件放在主屏幕上时遇到的错误

E/AndroidRuntime(10346): FATAL EXCEPTION: main
E/AndroidRuntime(10346): java.lang.RuntimeException: Unable to start receiver com.example.flash.FlashWidget: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2236)
E/AndroidRuntime(10346): at android.app.ActivityThread.access$1500(ActivityThread.java:130)
E/AndroidRuntime(10346): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)

【问题讨论】:

请看我的回答***.com/questions/7515309/… 【参考方案1】:

你必须在 manifest.xml 文件中添加一些条件

<receiver
        android:name=".FlashWidget "
        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/your xml file" />
    </receiver>

如果您发现任何问题,请告诉我。

【讨论】:

我的清单中有这个,这就是我访问我的 onReceive 函数的方式。 @flash onReceive() 调用与否? 我刚刚上传了我的清单,我不确定你在问什么。你能更具体一点吗?感谢您的帮助 我的答案完全符合您的要求,但我仍然收到错误消息。我的问题是打开和关闭相机。 哦,对不起,我刚刚看到您指向类似问题的链接。我会试一试。谢谢【参考方案2】:
Add camera.open();
if(isLightOn)           
        Log.i("info", "torch is turned off!");
        parameter.setFlashMode(Parameters.FLASH_MODE_OFF);
        Global.camera.setParameters(parameter);
        ibtnSwith.setBackgroundResource(R.drawable.switch_off);
        isLightOn = false;


     else 
        parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
        Global.camera.setParameters(parameter);                 
        isLightOn = true;
        ibtnSwith.setBackgroundResource(R.drawable.switch_on);
        playsound();
        Log.i("Home.java", "Torch is turned on!");  
    

【讨论】:

【参考方案3】:

在nexus设备中它应该添加一个转储表面以使闪存工作,我搜索了很长时间,我尝试了互联网上的每个代码但闪存没有打开,最后我找到了如下解决方案:

private void turnLEDOn() 

    // In order to work, the camera needs a surface to turn on.
    // Here I pass it a dummy Surface Texture to make it happy.
    camera = Camera.open();
    camera.setPreviewTexture(new SurfaceTexture(0));
    camera.startPreview();
    Parameters p = camera.getParameters();
    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    camera.setParameters(p);`enter code here`


private void turnLEDOff()

    if (camera != null)
    
        // Stopping the camera is enough to turn off the LED
        camera.stopPreview();
        camera.release();
        camera = null;
     else
        throw new NullPointerException("Camera doesn't exist to turn off.");


【讨论】:

以上是关于无法让安卓闪光灯小部件打开闪光灯的主要内容,如果未能解决你的问题,请参考以下文章

Flutter小记3Android打开前置或广角摄像头的同时打开闪光灯方案

Flutter小记3Android打开前置或广角摄像头的同时打开闪光灯方案

如何检查设备是不是有闪光灯 LED android

从 Activity 手动更改小部件状态

Android系统之路(初识MTK) ------Android11.0给系统相机添加闪光灯低电Toast提醒

Android系统之路(初识MTK) ------Android11.0给系统相机添加闪光灯低电Toast提醒