【问题标题】:Launch Intent from and to a WallpaperService从和向 WallpaperService 启动 Intent
【发布时间】:2014-01-30 16:34:48
【问题描述】:

我有一个显示图像的动态壁纸。我在活动中更改了该图像。然后我需要通知动态壁纸,让它知道重新加载资源。

Intents 似乎是完美、简单的解决方案:

Intent intent = new Intent(MyActivity.this, MyWallpaperService.class);
startService(intent);

我在 MyWallpaperService 中

@Override   
public int onStartCommand (Intent intent, int flags, int startId) {...}

我还需要知道,在另一项服务中,用户何时点击屏幕。我使用完全相同的机制来发送和接收意图。

一切都在 Android 4.0+ 设备和模拟器上完美运行。 但我在 Android 2.2 和 2.3.3 模拟器上测试并得到以下错误:

java.lang.SecurityException: Not allowed to start service Intent { cmp=com.domain.name/.liveWallpaper.MyWallpaperService } without permission android.permission.BIND_WALLPAPER

我的清单在服务标签内包含正确的 android:permission:

    <service
        android:name=".liveWallpaper.MyWallpaperService"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_WALLPAPER" >
        <intent-filter>
            <action android:name="android.service.wallpaper.WallpaperService" />
        </intent-filter>
        <meta-data
            android:name="android.service.wallpaper"
            android:resource="@xml/livewallpaper_data" />
    </service>

为什么我只在旧版本(Android 2.2 和 2.3.3)上收到此错误?是否不允许或不推荐将 Intent 发送到 WallpaperService?这是否与只有系统才能绑定到具有 BIND_WALLPAPER 权限的服务这一事实有关? 最后,如果意图不起作用,有什么替代的、简单的解决方案?

【问题讨论】:

标签: android android-intent android-service live-wallpaper


【解决方案1】:

尝试在清单文件中为您的服务添加权限,如下所示:

<service android:name=".LiveWallpaper"
android:label="@string/app_name"
android:icon="@drawable/icon"
android:permission="android.permission.BIND_WALLPAPER">

希望有帮助

【讨论】:

  • 将此添加到清单给我:“权限仅授予系统应用程序”
  • 窗口 -> 首选项 -> Android -> Lint 错误检查。从列表中找到 ProtectedPermission 并将严重性设置为错误以外的内容(例如信息)。这样你的项目仍然可以编译。
【解决方案2】:

java.lang.SecurityException: 不允许启动服务 Intent { cmp=com.domain.name/.liveWallpaper.MyWallpaperService } 没有 权限 android.permission.BIND_WALLPAPER

意味着您可能忘记在您的AndroidManifest.xml 中声明BIND_WALLPAPER 权限,如下所示:

 <service
   android:enabled="true"
   android:name="MyWallpaperService"
   android:permission="android.permission.BIND_WALLPAPER" />

【讨论】:

  • 将此添加到清单给我:“权限仅授予系统应用程序”。此权限旨在添加到服务中,如下所示:。权限添加正确,因为在我测试的所有 Android 4.0+ 设备上一切正常。
  • 请参阅stackoverflow.com/questions/13801984/… 了解另一种解决方案。
  • 我的应用不是系统应用,必须在非 root 设备上运行
  • 我刚刚重新检查并更新了我的答案。您需要声明壁纸服务的权限。
  • 就像我在原始问题和第一条评论中所说的那样,我已添加此权限。可以识别,因为删除权限会完全删除我的动态壁纸功能。
【解决方案3】:

Android Livewallpaper settings fail to load from 'configure...' menu

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.android.RrD"
  android:versionCode="1"
  android:versionName="1.0">

<uses-sdk android:minSdkVersion="8" />

<uses-feature android:name="android.software.live_wallpaper" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BIND_WALLPAPER" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

   <application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    >

    <service android:name=".LiveWallpaper"
        android:label="@string/app_name"
        android:icon="@drawable/icon"
        android:permission="android.permission.BIND_WALLPAPER">

        <intent-filter>
            <action android:name="android.service.wallpaper.WallpaperService" />
        </intent-filter>
        <meta-data android:name="android.service.wallpaper"
            android:resource="@xml/livewallpaper" />

    </service>

<activity android:label="PAM_Prefs"
        android:name=".PAM_Prefs" 

        android:exported="true" android:icon="@drawable/icon">
         <intent-filter>

            <category android:name="android.intent.category.PREFERENCE" />
        </intent-filter>
    </activity>

</application>
</manifest>

【讨论】:

  • 我尝试将 android.permission.BIND_WALLPAPER 添加到根目录,或者在应用程序、服务和我的活动标签中。都是不同的组合。这真的不是问题。从一开始就正确添加了权限。
【解决方案4】:

我仍然没有找到为什么这不起作用的确切解释,但我找到了解决方案:

创建一个将接收我的自定义 Intent 的 BroadcastReceiver。这意味着我将不再使用 startService(intent),而是使用 sendBroadcast(intent),这不会导致权限问题。 有关更多解释和代码,请参阅参考资料。

参考资料:

https://groups.google.com/forum/#!topic/android-developers/N8TzbbKwd5o

Permission to BIND_WALLPAPER required when messaging WallpaperService from Settings Activity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多