【问题标题】:How to Set wallpaper of image with its actual size?如何设置图像的实际尺寸壁纸?
【发布时间】:2014-05-08 08:17:21
【问题描述】:

我正在制作一个项目,其中壁纸将在每 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);
                }
            }

在活动类中...我收到“单击按钮”的日志,但没有收到“登录活动结果”的日志

@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 代码,它可以运行 goog 但不是很棒

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

}

【问题讨论】:

    标签: android


    【解决方案1】:

    前段时间我已经回答了一个类似的问题: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;
    }
    

    【讨论】:

    • 我可以知道你在这段代码中在哪里使用了计时器吗?我认为它适用于单个图像
    • 我不明白,定时器是什么或在哪里?
    • 请检查上面的 update2 我使用的代码及其仅设置图像的背景颜色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多