Android壁纸设置

  1. ####设置壁纸最常规的想法就是通过默认的WallpaperManager,方法如下:

     WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
                            wallpaperManager.suggestDesiredDimensions(bitmap.getWidth(),bitmap.getHeight());
     wallpaperManager.setBitmap(bitmap);

注意这里的

wallpaperManager.suggestDesiredDimensions(bitmap.getWidth(),bitmap.getHeight());

是表示设置目前的像素是图片的像素,最好先获取手机屏幕像素大小,然后传递宽度和高度作为参数。

WallpaperManager wallpaperManager = WallpaperManager.getInstance(DisplayPicture.this);
        wallpaperManager.suggestDesiredDimensions(Utils.getDisplayWidth(),Utils.getDisplayHeight());

因为某些手机是可以设置壁纸跟桌面一起滑动的,这样所需的壁纸长宽跟手机屏幕的长宽是不一样的,所以需要这样设置。

###但是问题来了,这样加载的bitmap需要裁减,并且加载后非常容易out of memory。所以尝试以下的解决方法:

  1. ####通过系统intent来设置,即传递一个image对象,系统luancher选择相应的程序来处理,这种方法还可以设置锁屏壁纸~~

传递的sendUri为图片的Uri,代码如下:

Intent setAs = new Intent(Intent.ACTION_ATTACH_DATA);
        setAs.setDataAndType(sendUri, "image/jpg");
        setAs.putExtra("mimeType","image/jpg");
        startActivity(Intent.createChooser(setAs, "set As"));

其中

setAs.putExtra("mineType","image/jpg")

非常重要,通过这句告诉intent的Filter当前intent的data传递的是什么内容,不加这一句会导致某些机型的相册程序崩溃。如vivo。。

另外关于mineType的其他可以参考这里

  1. ####将bitmap传入系统裁减intent,裁减至手机屏幕大小,然后在onActivitiyResult中捕捉bitmap并设置壁纸(强行避免OOM)

     Intent intent = new Intent("com.android.camera.action.CROP");
         intent.setDataAndType(sendUri, "image/*");
         intent.putExtra("crop", "true");
         //裁剪框的比例,1:1
         DisplayMetrics dm = new DisplayMetrics();
         dm = getResources().getDisplayMetrics();
         // float scale = (float)dm.heightPixels / (float)dm.widthPixels;
         intent.putExtra("aspectX", dm.widthPixels);
         intent.putExtra("aspectY", dm.heightPixels);
         intent.putExtra("scale",true);
         //裁剪后输出图片的尺寸大小
         intent.putExtra("outputX", dm.widthPixels);
         intent.putExtra("outputY", dm.heightPixels);
         Uri uri = Uri.fromFile(file);
         intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
         //图片格式
         intent.putExtra("outputFormat", "JPEG");
         intent.putExtra("noFaceDetection", true);
         intent.putExtra("return-data",false);
         startActivityForResult(intent, 1);

返回这里(file是通过sendUri new出来的):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == 1){
        Uri uri = Uri.fromFile(file);
         Bitmap bitmap = null;
        if(uri != null){
            try {
                bitmap= imgLoader.getBitmapByPath(uri.getPath());
                WallpaperManager wallpaperManager = WallpaperManager.getInstance(DisplayPicture.this);
                wallpaperManager.suggestDesiredDimensions(bitmap.getWidth(),bitmap.getHeight());
                wallpaperManager.setBitmap(bitmap);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    super.onActivityResult(requestCode, resultCode, data);
}