通过WallpaperManager解决华为M3青春版横屏壁纸缩放

我这里是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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值