我这里是10.1寸华为M3青春版,一般都横屏使用,原本想换一张自定义的壁纸,却被emui无脑缩放,裁剪的时候也只能裁剪为竖屏的,滚动更是无法直视,于是就手动写了个更换壁纸的软件,效果图如下,附件在最后面
图片来自P站画师Criin,https://twitter.com/Hanasa_Criin
图片裁剪用的是GitHub开源项目,gradle是compile ‘com.theartofdev.edmodo:android-image-cropper:2.4.4’
AndroidManifest.xml中添加三行:
1. 权限:<uses-permission android:name="android.permission.SET_WALLPAPER" />
2. application中添加android:largeHeap="true"
,减小OOM概率
3. 裁剪使用的activity:
<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity" />
HomeActivity.class
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.app.WallpaperManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ImageView;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import java.io.IOException;
public class HomeActivity extends AppCompatActivity {
// public static final String TAG = "HomeActivity";
private static final int SET_WALLPAPER_SUCCESS = 1;
private static final int SET_WALLPAPER_FAIL = 2;
private Uri mCropImageUri;
private WallpaperManager wallpaperManager;
private ProgressDialog progressDialog;
private ImageView imageView;
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progressDialog.dismiss();
switch (msg.what) {
case SET_WALLPAPER_SUCCESS:
onShowImage();
break;
case SET_WALLPAPER_FAIL:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
wallpaperManager = WallpaperManager.getInstance(this);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Please wait...");
imageView = (ImageView) findViewById(R.id.image_view);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onSelectImage();
}
});
onShowImage();
}
private void setAsWallPaper(final Uri imageUri) {
progressDialog.show();
// 开启线程,避免主线程工作太多,图片太大会OOM
new Thread() {
@Override
public void run() {
try {
Bitmap origin = getBitmapFromUri(imageUri);
// 设置桌面
wallpaperManager.setBitmap(drawBitmapFix(origin));
handler.sendEmptyMessage(SET_WALLPAPER_SUCCESS);
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(SET_WALLPAPER_FAIL);
}
}
}.start();
}
// 在imageView显示现在的桌面
private void onShowImage() {
Drawable drawable = wallpaperManager.getDrawable();
imageView.setImageDrawable(drawable);
}
// 开启图片选择器
private void onSelectImage() {
CropImage.startPickImageActivity(this);
}
// 开启图片裁剪
private void startCropImageActivity(Uri imageUri) {
CropImage.activity(imageUri)
.setMinCropResultSize(72, 72)
.setGuidelines(CropImageView.Guidelines.ON_TOUCH)
.setFixAspectRatio(false)
.setAllowRotation(true)
.setAspectRatio(1920, 1200) // 设置横纵比
.setOutputCompressQuality(100)
.setOutputCompressFormat(Bitmap.CompressFormat.PNG)
.start(this);
}
// 接收返回的Uri
@Override
@SuppressLint("NewApi")
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CropImage.PICK_IMAGE_CHOOSER_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Uri imageUri = CropImage.getPickImageResultUri(this, data);
// For API >= 23 we need to check specifically that we have permissions to read external storage.
if (CropImage.isReadExternalStoragePermissionsRequired(this, imageUri)) {
// request permissions and handle the result in onRequestPermissionsResult()
mCropImageUri = imageUri;
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE);
} else {
// no permissions required or already grunted, can start crop image activity
startCropImageActivity(imageUri);
}
} else if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
setAsWallPaper(resultUri);
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
// 权限管理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE) {
if (mCropImageUri != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// required permissions granted, start crop image activity
startCropImageActivity(mCropImageUri);
} else {
Snackbar.make(getWindow().getDecorView(), "Cancelling, required permissions are not granted", Snackbar.LENGTH_LONG).show();
}
}
}
// 从Uri获取Bitmap
private Bitmap getBitmapFromUri(Uri uri) throws IOException {
return MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
}
private Bitmap drawBitmapFix(Bitmap origin) {
// 拉伸/缩放位图
// Bitmap scaled = getResizedBitmap(origin, 1920, 1200, false); // 失真严重
Bitmap scaled = Bitmap.createScaledBitmap(origin, 1920, 1200, true); // 最后一定要返回true(抗锯齿)
// 创建空白位图
Bitmap output = Bitmap.createBitmap(1920, 1920, scaled.getConfig());
Canvas canvas = new Canvas(output);
// canvas设置抗锯齿
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
canvas.drawBitmap(scaled, 0, 360, null);
return output;
}
// private Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight, boolean isRecycle) {
// int width = bm.getWidth();
// int height = bm.getHeight();
// float scaleWidth = ((float) newWidth) / width;
// float scaleHeight = ((float) newHeight) / height;
// // CREATE A MATRIX FOR THE MANIPULATION
// Matrix matrix = new Matrix();
// // RESIZE THE BIT MAP
// matrix.postScale(scaleWidth, scaleHeight);
//
// // "RECREATE" THE NEW BITMAP
// Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
// if (isRecycle) bm.recycle();
// return resizedBitmap;
// }
}
下载链接:http://pan.baidu.com/s/1skF3Gy5 密码: pfhp