Android壁纸设置
####设置壁纸最常规的想法就是通过默认的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。所以尝试以下的解决方法:
- ####通过系统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的其他可以参考这里
####将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);
}