Android 从“活动”手动更改小部件状态

Android 从“活动”手动更改小部件状态,android,android-widget,Android,Android Widget,我的应用程序有一个小部件,当我们点击它时,它会点亮LED闪光灯,当我们再次点击它时,它会关闭 以下是代码(多亏了Kartik): WidgetProvider.java public class WidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]

我的应用程序有一个小部件,当我们点击它时,它会点亮LED闪光灯,当我们再次点击它时,它会关闭

以下是代码(多亏了Kartik):

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

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

        Intent receiver = new Intent(context, WidgetReceiver.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);

        views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, views);

    }
}
public class WidgetReceiver extends BroadcastReceiver {
    public static boolean isLightOn = false;
    public static Camera camera;

    @Override
    public void onReceive(Context context, Intent intent) {
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget);

        if (isLightOn) {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
        } else {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_checked);
        }


        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
        appWidgetManager.updateAppWidget(new ComponentName(context,
                WidgetProvider.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();
                }
            }
        }
    }
}
   public class WidgetProvider extends AppWidgetProvider {

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

             // Set widget's drawable to unchecked

            RemoteViews views2 = new RemoteViews(context.getPackageName(),
                    R.layout.widget);
            AppWidgetManager mManager = AppWidgetManager.getInstance(MainActivity
                    .getContext());
            ComponentName cn = new ComponentName(MainActivity.getContext(),
                    WidgetProvider.class);
            views2.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
            mManager.updateAppWidget(cn, views2);


            // Widget OnClick Behavior

            Intent receiver = new Intent(context, WidgetReceiver.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);

            views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetIds, views);

        }
    }
WidgetReceiver.java

public class WidgetProvider extends AppWidgetProvider {

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

        Intent receiver = new Intent(context, WidgetReceiver.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);

        views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, views);

    }
}
public class WidgetReceiver extends BroadcastReceiver {
    public static boolean isLightOn = false;
    public static Camera camera;

    @Override
    public void onReceive(Context context, Intent intent) {
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget);

        if (isLightOn) {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
        } else {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_checked);
        }


        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
        appWidgetManager.updateAppWidget(new ComponentName(context,
                WidgetProvider.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();
                }
            }
        }
    }
}
   public class WidgetProvider extends AppWidgetProvider {

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

             // Set widget's drawable to unchecked

            RemoteViews views2 = new RemoteViews(context.getPackageName(),
                    R.layout.widget);
            AppWidgetManager mManager = AppWidgetManager.getInstance(MainActivity
                    .getContext());
            ComponentName cn = new ComponentName(MainActivity.getContext(),
                    WidgetProvider.class);
            views2.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
            mManager.updateAppWidget(cn, views2);


            // Widget OnClick Behavior

            Intent receiver = new Intent(context, WidgetReceiver.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);

            views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetIds, views);

        }
    }
现在我想从我的应用程序中关闭小部件。在我的应用程序的主要活动中使用此代码,我可以释放小部件拍摄的相机:

MainActivity.java

//Stop widget camera
        if (WidgetReceiver.isLightOn){
        Camera a = WidgetReceiver.camera;
        a.stopPreview();
        a.release();
        a = null;
        WidgetReceiver.isLightOn=false;}
    public class MainActivity extends Activity {
        private static Context mContext;

        public static Context getContext() {
            return mContext;
        }


       @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            mContext = this;


                   //Stop widget camera

                    if (WidgetReceiver.isLightOn){
                    Camera a = WidgetReceiver.camera;
                    a.stopPreview();
                    a.release();
                    a = null;
                    WidgetReceiver.isLightOn=false;}


        // Fire Widget's update with Intent 

        Intent intent = new Intent(this, WidgetProvider.class);
                intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
                // Use an array and EXTRA_APPWIDGET_IDS instead of
                // AppWidgetManager.EXTRA_APPWIDGET_ID,
                // since it seems the onUpdate() is only fired on that:
                int[] ids = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
                sendBroadcast(intent);

}
但问题是小部件仍然设置为选中的可绘制(
R.drawable.widget\u lamp\u button\u checked
)。因此,手电筒已完全关闭,但我仍然需要强制小部件将其可绘制设置为未经检查的(
R.drawable.widget\u lamp\u button\u default

我该怎么做

编辑:问题已解决

WidgetProvider.java

public class WidgetProvider extends AppWidgetProvider {

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

        Intent receiver = new Intent(context, WidgetReceiver.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);

        views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, views);

    }
}
public class WidgetReceiver extends BroadcastReceiver {
    public static boolean isLightOn = false;
    public static Camera camera;

    @Override
    public void onReceive(Context context, Intent intent) {
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget);

        if (isLightOn) {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
        } else {
            views.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_checked);
        }


        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
        appWidgetManager.updateAppWidget(new ComponentName(context,
                WidgetProvider.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();
                }
            }
        }
    }
}
   public class WidgetProvider extends AppWidgetProvider {

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

             // Set widget's drawable to unchecked

            RemoteViews views2 = new RemoteViews(context.getPackageName(),
                    R.layout.widget);
            AppWidgetManager mManager = AppWidgetManager.getInstance(MainActivity
                    .getContext());
            ComponentName cn = new ComponentName(MainActivity.getContext(),
                    WidgetProvider.class);
            views2.setImageViewResource(R.id.imageButtonWidget,
                    R.drawable.widget_lamp_button_default);
            mManager.updateAppWidget(cn, views2);


            // Widget OnClick Behavior

            Intent receiver = new Intent(context, WidgetReceiver.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);

            views.setOnClickPendingIntent(R.id.imageButtonWidget, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetIds, views);

        }
    }
WidgetReceiver.java->保持不变

MainActivity.java

//Stop widget camera
        if (WidgetReceiver.isLightOn){
        Camera a = WidgetReceiver.camera;
        a.stopPreview();
        a.release();
        a = null;
        WidgetReceiver.isLightOn=false;}
    public class MainActivity extends Activity {
        private static Context mContext;

        public static Context getContext() {
            return mContext;
        }


       @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            mContext = this;


                   //Stop widget camera

                    if (WidgetReceiver.isLightOn){
                    Camera a = WidgetReceiver.camera;
                    a.stopPreview();
                    a.release();
                    a = null;
                    WidgetReceiver.isLightOn=false;}


        // Fire Widget's update with Intent 

        Intent intent = new Intent(this, WidgetProvider.class);
                intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
                // Use an array and EXTRA_APPWIDGET_IDS instead of
                // AppWidgetManager.EXTRA_APPWIDGET_ID,
                // since it seems the onUpdate() is only fired on that:
                int[] ids = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
                sendBroadcast(intent);

}

在AppWidgetProvider的onReceive()方法中,使用
AppWidgetManager
类的
updateAppWidgetGet
方法向AppWidgetProvider发送广播并更新小部件:

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


    ...
    views = new RemoteViews(context.getPackageName(),
    R.layout.yourwidgetlayout);
    AppWidgetManager mManager = AppWidgetManager.getInstance(App
    .getContext());
    ComponentName cn = new ComponentName(App.getContext(),
    YourAppWidgetProvider.class);
    //change your views,here I change text of text view witch it's id is "widgettextview" 
    views.setTextViewText(R.id.widgettextview, "lastWord");
    mManager.updateAppWidget(cn, views);
    ...
}     
以下是应用程序定义:

public class App extends Application implements OnInitListener {

    private static Context mContext;

    public void onCreate() {
        super.onCreate();
        mContext = this;
        }
    public static Context getContext() {
        return mContext;
    }
}

在AppWidgetProvider的onReceive()方法中,使用
AppWidgetManager
类的
updateAppWidgetGet
方法向AppWidgetProvider发送广播并更新小部件:

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


    ...
    views = new RemoteViews(context.getPackageName(),
    R.layout.yourwidgetlayout);
    AppWidgetManager mManager = AppWidgetManager.getInstance(App
    .getContext());
    ComponentName cn = new ComponentName(App.getContext(),
    YourAppWidgetProvider.class);
    //change your views,here I change text of text view witch it's id is "widgettextview" 
    views.setTextViewText(R.id.widgettextview, "lastWord");
    mManager.updateAppWidget(cn, views);
    ...
}     
以下是应用程序定义:

public class App extends Application implements OnInitListener {

    private static Context mContext;

    public void onCreate() {
        super.onCreate();
        mContext = this;
        }
    public static Context getContext() {
        return mContext;
    }
}

对不起,我不明白
应用程序
类的用法。为什么要使用与
TextToSpeech
api有关的
OnInitListener
呢?好吧,多亏了你的回答,我已经解决了我的问题,但是我没有使用你的
应用程序
类,但我从我的
main活动
类中获得了上下文(这可能是你的意思,我不明白?)。不管怎样,问题解决了(见帖子),谢谢你的回答:)。对不起,我不明白
应用程序的用法。为什么要使用与
TextToSpeech
api有关的
OnInitListener
呢?好吧,多亏了你的回答,我已经解决了我的问题,但是我没有使用你的
应用程序
类,但我从我的
main活动
类中获得了上下文(这可能是你的意思,我不明白?)。无论如何,问题解决了(见帖子),谢谢你的回答:)。