android相机led闪光灯小工具无法正常工作

时间:2016-08-27 12:09:44

标签: android flash camera widget light

我正在尝试构建并引导闪光灯小部件但是每当我尝试按下小部件时,编译器都没有显示任何错误显示小部件加载问题 和android studio没有显示任何错误我是初学者所以请帮助我。提前致谢

Meanifest文件

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mateen.flash_light_widget">


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


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver android:name=".NewAppWidget" android:icon="@drawable/example_appwidget_preview" 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/new_app_widget_info" />
        </receiver>

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



    </application>

</manifest>

appwidgetprovider类

   public class NewAppWidget 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.new_app_widget);
        views.setOnClickPendingIntent(R.id.button, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, views);

    }
}

接收有错误我认为编译器也没有显示任何错误

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

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

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        appWidgetManager.updateAppWidget(new ComponentName(context,     NewAppWidget.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,"noCamera", Toast.LENGTH_SHORT).show();
            } else {
                // Set the torch flash mode

                Camera.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,"no flash", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

小部件的布局文件

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/new_app_widget"
    android:initialLayout="@layout/new_app_widget"
    android:minHeight="40dp"
    android:minWidth="40dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen|keyguard"></appwidget-provider>

2 个答案:

答案 0 :(得分:0)

将这些权限添加到您的清单

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

答案 1 :(得分:0)

我找到解决方案为了工作,相机需要打开表面。 所以在camera.startPreview()之后我写了这条线

surfaceTexture = new SurfaceTexture(0);
 camera.setPreviewTexture(surfaceTexture);

它解决了我的问题,非常感谢:)。