4

I have an application of wallpapers where I allow the user to set wallpaper directly from the app. Here I convert http url of image into Bitmap and call WallpaperManager class of Android.

Following is code for converting URL to bitmap and setting into WallpaperManager bitmap:

private void setWallpaper() {
        WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
        try {
            Bitmap image = getBitMapFromHttpURL();
            if (image != null) {
                wallpaperManager.setBitmap(getBitMapFromHttpURL());
                image.recycle();
                image = null;
            } else {
                Toast.makeText(this, "Failed to set wallpaper",
                        Toast.LENGTH_LONG).show();
            }
        } catch (IOException e) {

        } catch (Exception es) {

        }
    }

It fails on this line wallpaperManager.setBitmap(getBitMapFromHttpURL()); with the following exception:

java.lang.SecurityException: Permission Denial: writing com.android.providers.settings.SettingsProvider uri content://settings/system from pid=21407, uid=10133 requires android.permission.WRITE_SETTINGS, or grantUriPermission()
       at android.os.Parcel.readException(Parcel.java:1465)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
       at android.content.ContentProviderProxy.insert(ContentProviderNative.java:468)
       at android.content.ContentResolver.insert(ContentResolver.java:1190)
       at android.provider.Settings$NameValueTable.putString(Settings.java:843)
       at android.provider.Settings.putString(Settings.java:6792)
       at android.provider.Settings.putString(Settings.java:6717)
       at android.app.WallpaperManager.willSendBroadcat(WallpaperManager.java:1124)
       at android.app.WallpaperManager.setBitmap(WallpaperManager.java:788)
       at com.wallie.WallpaperFullScreenActivity.setWallpaper(WallpaperFullScreenActivity.java:453)
       at com.wallie.WallpaperFullScreenActivity.access$1(WallpaperFullScreenActivity.java:448)
       at com.wallie.WallpaperFullScreenActivity$WallpaperManagerTask.doInBackground(WallpaperFullScreenActivity.java:473)
       at com.wallie.WallpaperFullScreenActivity$WallpaperManagerTask.doInBackground(WallpaperFullScreenActivity.java:1)
       at android.os.AsyncTask$2.call(AsyncTask.java:295)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:238)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:841)

What can be the reason?

MysticMagicϡ
  • 28,593
  • 16
  • 73
  • 124
virendrao
  • 1,763
  • 2
  • 22
  • 42

4 Answers4

5

The exception you are getting clearly defines you need to add the permission in Manifest.

java.lang.SecurityException: Permission Denial: writing com.android.providers.settings.SettingsProvider uri content://settings/system from pid=21407, uid=10133 requires android.permission.WRITE_SETTINGS, or grantUriPermission()

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
SweetWisher ツ
  • 7,296
  • 2
  • 30
  • 74
2

The logcat is clear:

java.lang.SecurityException: Permission Denial: writing com.android.providers.settings.SettingsProvider uri content://settings/system from pid=21407, uid=10133 requires android.permission.WRITE_SETTINGS, or grantUriPermission()

So you just need to add this permission in your Manifest file:

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

under application tag.

Hope it helps.

MysticMagicϡ
  • 28,593
  • 16
  • 73
  • 124
1

Your are missing to add WRITE_SETTINGS permission in AndroidManifest.xml.

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

If you dont required Bitmap object longer then directly check from bitamp using getBitMapFromHttpURL instead declare Bitamp object.

if (getBitMapFromHttpURL() != null) {
    wallpaperManager.setBitmap(getBitMapFromHttpURL());
} else {
    Toast.makeText(this, "Failed to set wallpaper",Toast.LENGTH_LONG).show();
}
Haresh Chhelana
  • 24,720
  • 5
  • 57
  • 67
0

May you forgot to take any of this Permissions:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
Pratik Butani
  • 60,504
  • 58
  • 273
  • 437