Android 如何将图像的壁纸设置为其实际尺寸?

Android 如何将图像的壁纸设置为其实际尺寸?,android,Android,我正在做一个项目,其中墙纸将改变后,每5秒。我可以设置壁纸,但它通过裁剪图像来设置壁纸。我想将壁纸设置为实际尺寸,对此我必须怎么做 BitmapFactory.decodeFile(list.get(i)); options.inJustDecodeBounds = false; if (myBitmap != null) { myBitmap.recycle();

我正在做一个项目,其中墙纸将改变后,每5秒。我可以设置壁纸,但它通过裁剪图像来设置壁纸。我想将壁纸设置为实际尺寸,对此我必须怎么做

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);
                }

更新1:

如果我使用这个代码,墙纸就是按照图像的实际大小设置的。 现在我遇到了一个小问题,即当我再次打开应用程序并单击“选择照片”按钮时,照片不会显示在自定义图库中

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);
                }
            }
for(int i=0;i要求宽度){
//计算高度和宽度与所需高度和宽度的比率
//宽度
最终整数高度比=数学圆((浮动)高度
/(浮动)高度);
最终整数宽度比=数学圆((浮动)宽度/(浮动)宽度);
//选择最小比率作为采样值,这将
//保证
//最终图像的两个尺寸均大于或等于
//要求的高度和宽度。
inSampleSize=高度比<宽度比?高度比:宽度比;
}
//Log.d(MainActivity.TAG,“样本大小:”+inSampleSize);
返回样本大小;
}
}

不久前我已经回答了一个类似的问题:

我还创建了一个简单的应用程序来随机更改墙纸,完整文件的代码可能就是您想要的(这里的两个关键功能是
decodeSampledBitmapFromFile
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;
}
private void changeWallPaper(inth,intw){
字符串路径=getRandomFile();
位图bm=decodeSampledBitmapFromFile(路径,w,h);
试一试{
WallpaperManager mywall=wallperManager.getInstance(this);
Log.i(MainActivity.TAG,“将壁纸设置为”+路径);
mywall.setBitmap(bm);
}捕获(IOE异常){
Log.e(MainActivity.TAG,“无法将图像设置为壁纸”,e);
}
}
公共静态位图decodeSampledBitmapFromFile(字符串路径、整型宽度、整型高度){
//使用INJUSTDECBOUNDS首次解码=true检查尺寸
final BitmapFactory.Options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
解码文件(路径、选项);
//字符串imageType=options.outMimeType;
//计算样本大小
options.inSampleSize=计算样本大小(选项、宽度、高度);
//使用inSampleSize集合解码位图
options.inJustDecodeBounds=false;
返回BitmapFactory.decodeFile(路径、选项);
}
/**
* 
*@param选项
*@param reqWidth
*@param req高度
*@return int
*@见http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
*/
公共静态int-calculateInSampleSize(BitmapFactory.Options、,
输入要求宽度,输入要求高度){
//图像的原始高度和宽度
最终内部高度=options.outHeight;
最终整数宽度=options.outWidth;
int inSampleSize=1;
如果(高度>要求高度| |宽度>要求宽度){
//计算高度和宽度与所需高度和宽度的比率
//宽度
最终整数高度比=数学圆((浮动)高度
/(浮动)高度);
最终整数宽度比=数学圆((浮动)宽度/(浮动)宽度);
//选择最小比率作为采样值,这将
//保证
//最终图像的两个尺寸均大于或等于
//要求的高度和宽度。
inSampleSize=高度比<宽度比?高度比:宽度比;
}
Log.d(MainActivity.TAG,“样本大小:”+inSampleSize);
返回样本大小;
}

我可以知道在这段代码中您在哪里使用了计时器吗?我想它是针对单个图像的,我不明白,计时器是什么或在哪里?请检查上面的更新2我使用了代码,它的设置仅用于图像的背景色
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;
    }

}
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;
}