文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android如何设置默认锁屏壁纸接口

2023-06-26 03:58

关注

本篇内容主要讲解“Android如何设置默认锁屏壁纸接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何设置默认锁屏壁纸接口”吧!

完成自定义service后,接下来就是具体实现接口

在frameworks/base/core/java/android/app/customized/ICustomizedService.aidl中定义接口

boolean setLockScreenWallpaper(String uri);

在frameworks/base/core/java/android/app/customized/CustomizedManager.java中实现接口

package android.app.customized; import android.util.Log;import android.content.Context;import android.content.Intent;import android.os.Binder;import android.os.RemoteException;import android.provider.Settings;import java.io.IOException;import android.os.ServiceManager;import android.os.IBinder;import java.util.List;import android.app.ActivityManager;import android.graphics.Bitmap;  public class CustomizedManager{    private static final String TAG="CustomizedManager";    private static final boolean DBG=true;        private static ICustomizedService mService;    private final Context mContext;      public CustomizedManager(Context context){        mContext = context;        mService = ICustomizedService.Stub.asInterface(                ServiceManager.getService("customized"));    }    private static ICustomizedService getService(){        if (mService != null) {            return mService;        }                IBinder b = ServiceManager.getService("customized"        mService = ICustomizedService.Stub.asInterface(b);        return mService;    }    public boolean setLockScreenWallpaper(String uri) {        try {            getService().setLockScreenWallpaper(uri);        } catch (RemoteException e) {        }        return false;    } }

在frameworks/base/services/core/java/com/android/server/customized/CustomizedService.java中对AIDL文件中定义的接口进行具体实现.

package com.android.server.customized; import android.os.IBinder;import android.os.ServiceManager;import android.content.Context;import android.content.Intent;import android.os.Binder;import android.app.customized.ICustomizedService;import android.content.BroadcastReceiver;import android.view.IWindowManager;import android.view.WindowManagerGlobal;import android.graphics.BitmapFactory;  public class CustomizedService extends ICustomizedService.Stub {    private static final String TAG = "CustomizedService ";    private Context mContext;     public static class Lifecycle extends SystemService {        private CustomizedService mService;        public Lifecycle(Context context) {            super(context);        }         @Override        public void onStart() {            mService = new CustomizedService (getContext());            publishBinderService(Context.CUSTOMIZED, mService);        }        @Override        public void onBootPhase(int phase) {        }         @Override        public void onUnlockUser(int userHandle) {        }    }     public CustomizedService (Context context) {       mContext = context;   }     public boolean setLockScreenWallpaper(String uri) {        if (uri == null || "".equals(uri))            return false;        File file = new File(uri);        if (!file.exists()) {            return false;        }        Log.d(TAG, "setLockScreenWallpaper uri===============" + uri);        long ident = Binder.clearCallingIdentity();        Intent sendlock = new Intent();        String packageName = "com.android.launcher3";        String serviceClassName = packageName + ".LockScreenWallPaperService";        sendlock.putExtra("path", uri);        sendlock.setComponent(new ComponentName(packageName, serviceClassName));        mContext.startServiceAsUser(sendlock, UserHandle.OWNER);        Binder.restoreCallingIdentity(ident);        return true;    }  }

在packages/apps/Launcher3/AndroidManifest.xml中注册LockScreenWallPaperService

<service            android:name="com.android.launcher3.LockScreenWallPaperService"            android:exported="true" >            <intent-filter>                <action android:name="com.android.launcher.action.SET_LOCKSCREENWALLPAPER_SERVICE" />            </intent-filter></service>

因为我们只是在CustomizedService 中调用setLockScreenWallpaper方法启动LockScreenWallPaperService,所以设置默认wallpaper还是要由setLockScreenWallpaper实现的.下面要实现LockScreenWallPaperService了,路径为packages/apps/Launcher3/src/com/android/launcher3/LockScreenWallPaperService.java

package com.android.launcher3; import android.app.Service;import android.os.*;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.content.Context;import android.content.Intent;import android.graphics.Matrix;import android.util.Log;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; public class LockScreenWallPaperService extends Service {    private String TAG = "LockScreenWallPaperService";    private String path = "";     @Override    public void onCreate() {     }     @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.d(TAG, "onStartCommand ");         if (intent != null) {            path = intent.getStringExtra("path");        }         Bitmap bitmap = BitmapFactory.decodeFile(path);        SavePicToLocal savePic = new SavePicToLocal(bitmap);        savePic.execute("save picture");         return START_STICKY;    }     public boolean dumpBitmap(Bitmap mBitmap) throws FileNotFoundException {        Log.d(TAG, "dumpBitmap");        boolean flagSaveCompelete = false;        Bitmap bitmap_land, bitmap_port;        int height = mBitmap.getHeight();        int width = mBitmap.getWidth();         int lswidth = 1920;        int lsheight = 1200;        float lper = Math.max((float) lswidth / (float) width, (float) lsheight                / (float) height);        if (lper > 1) {            Matrix lmatrix = new Matrix();            lmatrix.postScale(lper, lper);            bitmap_land = Bitmap.createBitmap(mBitmap,                    (int) ((mBitmap.getWidth() - lswidth / lper) / 2),                    (int) ((mBitmap.getHeight() - lsheight / lper) / 2),                    (int) (lswidth / lper), (int) (lsheight / lper), lmatrix,                    true);        } else {            bitmap_land = Bitmap.createBitmap(mBitmap,                    (int) ((mBitmap.getWidth() - lswidth) / 2),                    (int) ((mBitmap.getHeight() - lsheight) / 2), lswidth,                    lsheight, null, true);        }         int pswidth = 1200;        int psheight = 1920;        float pper = Math.max((float) pswidth / (float) width, (float) psheight                / (float) height);        if (pper > 1) {            Matrix pmatrix = new Matrix();            pmatrix.postScale(pper, pper);            bitmap_port = Bitmap.createBitmap(mBitmap,                    (int) ((mBitmap.getWidth() - pswidth / pper) / 2),                    (int) ((mBitmap.getHeight() - psheight / pper) / 2),                    (int) (pswidth / pper), (int) (psheight / pper), pmatrix,                    true);        } else {            bitmap_port = Bitmap.createBitmap(mBitmap,                    (int) ((mBitmap.getWidth() - pswidth) / 2),                    (int) ((mBitmap.getHeight() - psheight) / 2), pswidth,                    psheight, null, true);        }        Matrix matrix = new Matrix();        matrix.postScale(0.5f, 0.5f);        bitmap_land = Bitmap.createBitmap(bitmap_land, 0, 0,                bitmap_land.getWidth(), bitmap_land.getHeight(), matrix, true);        bitmap_port = Bitmap.createBitmap(bitmap_port, 0, 0,                bitmap_port.getWidth(), bitmap_port.getHeight(), matrix, true);        flagSaveCompelete = saveBitmapToFile(                bitmap_port,                "/data/local/tmp/lockscreenwallpaper/keyguard_wallpaper_land.png",                1);        flagSaveCompelete = saveBitmapToFile(                bitmap_land,                "/data/local/tmp/lockscreenwallpaper/keyguard_wallpaper_port.png",                2);        return flagSaveCompelete;    }     private boolean saveBitmapToFile(Bitmap bitmap, String path, int isRecycle)            throws FileNotFoundException {         Log.d(TAG, "saveBitmapToFile ident=" + "bitmap" + bitmap);        boolean result = false;        if (bitmap == null)            return result;        Bitmap tmpbm = null;        java.io.FileOutputStream tmpfos = null;        try {            tmpbm = bitmap;            tmpfos = new java.io.FileOutputStream(path);            tmpbm.compress(Bitmap.CompressFormat.PNG, 100, tmpfos);            Log.d(TAG, "saveBitmapToFile compress");        } catch (FileNotFoundException ex) {            Log.d(TAG, "ex1" + ex);            throw ex;        } catch (java.io.IOException ex) {            Log.d(TAG, "ex2" + ex);            ex.printStackTrace();        } finally {            if (tmpfos != null) {                try {                    Log.d(TAG, "tmpfos.close() ");                    tmpfos.close();                    result = true;                } catch (java.io.IOException ex) {                    Log.d(TAG, "ex3" + ex);                }            }            if (tmpbm != null && !tmpbm.isRecycled())                if (isRecycle == 2) {                    tmpbm.recycle();                }        }         return result;    }     class SavePicToLocal extends AsyncTask<String, Integer, Boolean> {        Bitmap bitmap;                public SavePicToLocal(Bitmap mBitmap) {            bitmap = mBitmap;        }         @Override        protected Boolean doInBackground(String... params) {            return dumpBitmaps();        }         private boolean dumpBitmaps() {            boolean flag = false;            try {                flag = dumpBitmap(bitmap);                flag = true;            } catch (FileNotFoundException e) {            }            return flag;        }        @Override        protected void onPostExecute(Boolean result) {            if (result) {                sendBroadcast(new Intent(                        "android.intent.action.UPDATE_LOCK_WALLPAPER"));                Log.d(TAG, "send UPDATE_LOCK_WALLPAPER");            }         }         @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);        }    }     @Override    public IBinder onBind(Intent intent) {        return null;    } }

然后编译一下,就可以通过接口设置默认桌面了,大功告成

到此,相信大家对“Android如何设置默认锁屏壁纸接口”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯