2

私のアプリには、クリックすると 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);

    }
}

WidgetReceiver.java

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();
                }
            }
        }
    }
}

ここで、アプリ内からウィジェットをオフにしたいと思います。アプリのメイン アクティビティでこのコードを使用すると、ウィジェットが撮影したカメラを解放できます。

MainActivity.java

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

しかし問題は、ウィジェットがまだチェック済みのドローアブル ( R.drawable.widget_lamp_button_checked) に設定されていることです。したがって、FlashLight は十分にオフになっていますが、ウィジェットのドローアブルを未チェックのもの ( R.drawable.widget_lamp_button_default) に強制的に設定する必要があります。

これどうやってするの ?

編集:問題が解決しました

WidgetProvider.java

   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

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

}
4

1 に答える 1

0

AppWidgetProvider にブロードキャストを送信し、AppWidgetProvider の onReceive() メソッド updateAppWidgetでクラスのメソッドを使用してウィジェットを更新します。AppWidgetManager

@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;
    }
}
于 2012-07-19T11:08:04.397 に答える