2014-01-21 4 views
3

У меня есть живые обои, которые отображают изображение. Я изменяю этот образ в активности. Затем мне нужно оповестить живые обои, чтобы он мог перезагрузить ресурсы.Launch Intent from and to the WallpaperService

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 

Мой манифест содержит правильный андроида: разрешение внутри тега службы:

<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)? Не посылаете ли намерения в WallpaperService не рекомендуется или не рекомендуется? Имеет ли это какое-то отношение к тому факту, что только система может привязываться к службе с разрешением BIND_WALLPAPER? В конце концов, если намерения не работают, что такое альтернатива, простое решение?

+1

Попробуйте это решение: http://stackoverflow.com/questions/20915926/communicate-with-a-wallpaperservice –

+0

Я не думаю, что существует в WallpaperService 2,3? Я думаю, что это только после API16. Кажется, все демоверсии указывают на это. – Radu

ответ

1

Я до сих пор не нашел точное объяснение, почему это не работает, но я нашел решение:

Создание BroadcastReceiver, который будет получать свои собственные намерения. Это означает, что я больше не буду использовать startService (намерение), но sendBroadcast (намерение), что не вызовет проблемы с разрешением. См. Ссылки для получения дополнительных пояснений и кода.

Ссылки:

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

Permission to BIND_WALLPAPER required when messaging WallpaperService from Settings Activity

1

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

означает, что вы, вероятно, забыли объявить BIND_WALLPAPER разрешения в вашем AndroidManifest.xml, как это:

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

Добавление этого в манифест дает мне: «Разрешение предоставляется только системным приложениям». Это разрешение должно быть добавлено в службу, например: .Разрешение добавляется правильно, так как все работает хорошо на всех устройствах Android 4.0+, которые я тестировал. – Twinsen

+0

См. Https://stackoverflow.com/questions/13801984/permission-is-only-granted-to-system-app для другого решения. – keyboardsurfer

+0

Мое приложение не является системным приложением и должно работать на ненарушенных устройствах – Twinsen

1

попытки добавить разрешения вашей службе в файле манифеста, как следующее:

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

Надеюсь, что Помощи

+0

Добавление этого в манифест дает мне: «Разрешения предоставляются только системным приложениям» – Twinsen

+0

Окно -> Настройки -> Android -> Проверка ошибок Lint. Найдите ProtectedPermission из списка и установите степень важности для чего-либо, кроме ошибки (например, информация). Таким образом, ваш проект будет компилироваться. –

1

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> 
+0

Я попытался добавить android.permission.BIND_WALLPAPER к корню, или в приложении, и в тегах активности. Все в разных комбинациях. Это действительно не проблема. Разрешение было добавлено правильно с самого начала. – Twinsen