1

私のアプリをエミュレーターにインストールすると、次のようになります。

エラー/AndroidRuntime(465): java.lang.RuntimeException: レシーバー com.myPackage.Widget.MYWidget を開始できません: java.lang.SecurityException: サービスを開始できません Intent { cmp=com.myPackage/.Widget.MYWidget$MyWidgetService許可なく android.permission.BIND_REMOTEVIEWS

これが私のマニフェストのコードです

    <!-- Broadcast Receiver that will process AppWidget updates -->
    <receiver android:name=".Widget.MYWidget" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

            <!--Broadcast Receiver that will also process our self created action -->
            <action android:name="com.temp.package.Widget.MYWidget.ACTION_WIDGET_LEFT_RECEIVER" />


            <action android:name="com.temp.package.Widget.MYWidget.ACTION_WIDGET_PROGRESSBAR_RECEIVER" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/mywidget_widget_provider" />

    </receiver>
    <service android:name=".Widget.MYWidget$MyWidgetService"
        android:permission="android.permission.BIND_REMOTEVIEWS"
        android:exported="true"  />
        <uses-permission
    android:name="android.permission.BIND_REMOTEVIEWS"></uses-permission>

これは私のコードです

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

    Intent svcIntent = new Intent(context, MyWidgetService.class);

    //svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
    context.startService(svcIntent);
}

public static class MyWidgetService extends Service
{
    @Override
    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        // Update the widget
        RemoteViews remoteView = buildRemoteView(this);

        // Push update to homescreen
        pushUpdate(remoteView);

        // No more updates so stop the service and free resources
        stopSelf();
    }

    public RemoteViews buildRemoteView(Context context)
    {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

        //do stuff


        return remoteViews;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        int oldOrientation = this.getResources().getConfiguration().orientation;

        if(newConfig.orientation != oldOrientation)
        {
            // Update the widget
            RemoteViews remoteView = buildRemoteView(this);

            // Push update to homescreen
            pushUpdate(remoteView);
        }
    }

    private void pushUpdate(RemoteViews remoteView)
    {
        ComponentName myWidget = new ComponentName(this, MyWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(myWidget, remoteView);
    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        // TODO Auto-generated method stub
        return null;
    }
}
4

2 に答える 2

6

取り除く:

    android:permission="android.permission.BIND_REMOTEVIEWS"
    android:exported="true"

<service>ここではどちらも必要ないため、要素から。これで問題が解決するはずです。

于 2011-09-29T20:29:25.467 に答える
0

ウィジェットを追加すると、垂直モードになります。方向の変更が発生したとき(水平方向)-onConfigurationChangedを呼び出す必要があると思いましたが、そうではありません-したがって、ウィジェットは後で機能しません

このためには、処理したい android:configChanges パラメータに言及する必要があります。ICSコードで作業している場合は、「screenSize」要素を「keyboardHidden|screenSize」などの他のパラメーターとともに配置する必要があります。これが役立つことを願っています。

私は活動のためだけにこれを述べました...私はあなたの質問を間違って受け取りました. 更新ありがとう。

于 2012-01-04T08:43:01.030 に答える