android - 如何以实际尺寸设置图片壁纸?

标签 android

我正在制作一个壁纸每 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);
                }
            }

在 Activity 课上...我得到日志“按钮被点击”但我没有得到日志“在 Activity 结果中”

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

更新 2..

我之前试过,现在又试了一次,它只是将图像的背景色设置为墙纸。如果我使用 Update1 代码,它可以正常工作,但效果不佳

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

}

最佳答案

我前段时间已经回答过类似的问题:How to set wallpaper permanently in android

我也创建了一个简单的应用程序来随机更改壁纸,完整文件的代码是 here也许是你想要的(这里的两个关键函数是 decodeSampledBitmapFromFilecalculateInSampleSize:

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

关于android - 如何以实际尺寸设置图片壁纸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23536342/

相关文章:

android - 在sqlite db中获取id和存储值的最大值

Android 1 Parent ScrollView, 3 TextView 垂直滚动

android - Android 上的临时通信(消息)系统

java - Pyjnius 自定义 java 方法返回 'JavaException: Unable to find a None Method' 在 Public Static 之后工作

android - 为什么AccountManager管理的账户会被自动删除?

java - 适用于 Android 的 SSH Java 库?

java - 如何使用 okhttp 执行 Reddit 帖子

java - 生成随机循环数

android - Android fragment 之间的阴影分隔符

android - Kotlin:尝试将以下函数添加到全局共享文件以在多个 Activity 中使用,但不断收到不同的错误