2

I am making a project in which wallpapers will be changed after every 5 seconds. I am able to set wallpaper but it is setting the wallpaper by cropping the image. I want to set the wallpaper in its actual size what must i do regarding this?

BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }
                Bitmap decodedSampleBitmap = BitmapFactory.decodeFile(list
                        .get(i));
// here height and width are the height and width of the display screen
                myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap,
                        width, height, true);
                if (decodedSampleBitmap != myBitmap)
                    decodedSampleBitmap.recycle();
                decodedSampleBitmap = null;

                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(myBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }

Update 1:

If i use this code the wallpaper is settingup with image's actual size. Now i am having a small problem i.e when i open the app again and click on select photos button the photos are not displaying in custom gallery

for (int i = 0; i <= list.size(); i++) {
                if (i == list.size()) {
                    i = 0;
                }

                BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }

                if (decodedSampleBitmap != null) {
                    decodedSampleBitmap.recycle();
                    decodedSampleBitmap = null;
                }
                decodedSampleBitmap = BitmapFactory.decodeFile(list
                        .get(i));
                //myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap, width, height, true);
                /*if (decodedSampleBitmap != myBitmap)
                    decodedSampleBitmap.recycle();
                decodedSampleBitmap = null;
*/
                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(decodedSampleBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }
            }

in activity class... i am getting the log "button clicked" but i am not getting the log "in on activity result"

@Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.btnAddPhots:
            Intent intent = new Intent(MainActivity.this,
                    CustomPhotoGalleryActivity.class);
            startActivityForResult(intent, PICK_IMAGE_MULTIPLE);
            Log.i("Main Activity", "button clicked");
            break;



@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("Main Activity", "in on activity result");
        if (resultCode == RESULT_OK) {
            Log.i("Main Activity", "in if1");
            if (requestCode == PICK_IMAGE_MULTIPLE) {
                Log.i("Main Activity", "in if2");
                imagesPathList = new ArrayList<String>();
                String[] imagesPath = data.getStringExtra("data").split("\\|");
                try {
                    Log.i("Main Activity", "in try");
                    lnrImages.removeAllViews();
                } catch (Throwable e) {
                    Log.i("Main Activity", "in catch");
                    e.printStackTrace();
                }

Update 2..

I tried it earlier also i tried it now again it is stting up the background colour of the image only as wallpaper. If i use the Update1 code it is working goog but not awesome

Public class WallService extends Service {

    ArrayList<String> list;
    Bitmap myBitmap;
    int width, height;
    Bitmap decodedSampleBitmap = null;

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

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.i("on create", "Service Created");

    }

    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);

        list = intent.getStringArrayListExtra("Imagess");
        width = intent.getExtras().getInt("Width");
        height = intent.getExtras().getInt("Height");
        Log.i("Width= ", "" + width);
        Log.i("Height= ", "" + height);
        new LongOperation().execute("");
    }

    private class LongOperation extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {

            int h = 0;
            int w = 0;

            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            for (int i = 0; i <= list.size(); i++) {
                if (i == list.size()) {
                    i = 0;
                }

                BitmapFactory.decodeFile(list.get(i));
                options.inJustDecodeBounds = false;

                if (myBitmap != null) {
                    myBitmap.recycle();
                    myBitmap = null;
                }

                if (decodedSampleBitmap != null) {
                    decodedSampleBitmap.recycle();
                    decodedSampleBitmap = null;
                }
                decodedSampleBitmap = decodeSampledBitmapFromFile(list.get(i),
                        w, h);
                // myBitmap = Bitmap.createScaledBitmap(decodedSampleBitmap,
                // width, height, true);
                /*
                 * if (decodedSampleBitmap != myBitmap)
                 * decodedSampleBitmap.recycle(); decodedSampleBitmap = null;
                 */
                WallpaperManager wm = WallpaperManager
                        .getInstance(WallService.this);
                try {
                    Log.i("In Service", "before set wallpaper");
                    wm.setBitmap(decodedSampleBitmap);
                    Log.i("In Service", "after set wallpaper");
                    Thread.sleep(5000);
                    Log.i("In Service", "after thread");

                } catch (Exception e) {
                    Log.e("Exception", "Cannot set image as wallpaper", e);
                }
            }
            return "Executed";
        }

        public Bitmap decodeSampledBitmapFromFile(String path, int width,
                int height) {
            // TODO Auto-generated method stub
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, options);
            // String imageType = options.outMimeType;

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, width, height);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;

            return BitmapFactory.decodeFile(path, options);
        }

        @Override
        protected void onPostExecute(String result) {

        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

    public int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        // TODO Auto-generated method stub
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and
            // width
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will
            // guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        // Log.d(MainActivity.TAG, " in sample Size: " + inSampleSize);
        return inSampleSize;
    }

}
nawaab saab
  • 1,892
  • 2
  • 20
  • 36

1 Answers1

1

I already answered a similar question some time ago: How to set wallpaper permanently in android

I've created a simple app to change the wallpaper randomly too, The code of the full file is here Maybe is what you want (The two key functions here are decodeSampledBitmapFromFile and calculateInSampleSize:

private void changeWallPaper(int h, int w){
    String path = getRandomFile();
    Bitmap bm = decodeSampledBitmapFromFile(path, w, h);

    try {
        WallpaperManager mywall = WallpaperManager.getInstance(this);
        Log.i(MainActivity.TAG, "Setting wallpaper to " + path);
        mywall.setBitmap(bm);
    } catch (IOException e) {
        Log.e(MainActivity.TAG, "Cannot set image as wallpaper", e);
    }
}

public static Bitmap decodeSampledBitmapFromFile(String path, int width, int height) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);
    //String imageType = options.outMimeType;

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, width, height);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(path, options);
}
/**
 * 
 * @param options
 * @param reqWidth
 * @param reqHeight
 * @return int
 * @see http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
 */
public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and
        // width
        final int heightRatio = Math.round((float) height
                / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will
        // guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    Log.d(MainActivity.TAG, " in sample Size: " + inSampleSize);
    return inSampleSize;
}
Community
  • 1
  • 1
Alejandro Alcalde
  • 5,990
  • 6
  • 39
  • 79