Android设置默认锁屏壁纸接口的方法
作者:lancelots 发布时间:2021-09-25 00:16:42
本文实例为大家分享了Android设置默认锁屏壁纸接口的具体代码,供大家参考,具体内容如下
完成自定义service后,接下来就是具体实现接口
1、在frameworks/base/core/java/android/app/customized/ICustomizedService.aidl中定义接口
boolean setLockScreenWallpaper(String uri);
2、在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;
}
}
3、在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;
}
}
4、在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>
5、因为我们只是在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;
}
}
然后编译一下,就可以通过接口设置默认桌面了,大功告成。
来源:https://blog.csdn.net/lancelots/article/details/82995818


猜你喜欢
- 一、图示我们先来看看今天要介绍哪些内存溢出案例,这里总结了一张图,如下所示。二、定义主类结构首先,我们创建一个名称为BlowUpJVM的类,
- using System;using System.Collections;using System.Xml;namespace Jb51.
- 本文实例讲述了C#从DataTable获取数据的方法。分享给大家供大家参考。具体如下:通过通用类,返回一个DataTable,要想显示每个单
- 本文实例讲述了C#使用foreach语句遍历队列(Queue)的方法。分享给大家供大家参考。具体如下:using System;using
- 在spring boot中,简单几步,使用spring AOP实现一个 * :1、引入依赖:<dependency> &nbs
- 一、概述当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。一般情况下,我们知道View类有个View
- 一、实现原理使用MockMvc发起请求,然后执行API中相应的代码,在执行的过程中使mock模拟底层数据的返回,最后结果验证。二、常用注解介
- logback-classic 使用testCompile的打包今天使用gradle打包的时候logback-classic一直打包不进去。
- 问题:1.线程 wait()方法使用有什么前提?2. 多线程之间如何进行通信?3. Java 中 notify 和 notifyAll 有什
- 本文实例所述为Android天气预报之解析天气数据的代码,可实现获取HttpGet对象读取天气网站天气数据,并从数据中解析出天气数据,比如温
- 在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主。下面给出用java写入数据到excel表格方法:1.添加jar文件java
- 最近在做一个移动端HTML5的应用,使用到了上传功能,起初使用传统的上传方式上传手机拍照的照片,由于手机拍照出来的照片一般都是好几MB,所以
- 1.基本知识介绍首先,C#中的.net的常用对话框中没有映射网络驱动映射对话框,所以需要用windows的API函数去实现弹出映射网络驱动器
- Java使用OpenCV3.2实现视频读取与播放,供大家参考,具体内容如下OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写
- 上一篇文章讲的是Java实现两人五子棋游戏(二) 画出棋盘,已经画好棋盘,接下来要实现控制功能,主要功能:1)选择棋子2)画棋子3)判断胜负
- 一、问题重现1.配置文件spring: #DataSource数据源 datasource: &nbs
- 自定义一个漂亮实用的锁屏app,如果能赢得用户的认可,替换系统自带的锁屏,绝对是一个不小的日活入口。这段时间正好总结一下最近调研的Andro
- 前言: 最近一直在看Launcher模块,经过差不多两个月学习,终于摸透了Launcher的一些主要功能实现,目前继续还处于摸索状态。未看L
- 测试Spring Boot定时任务冲突时,使用的线程数量引入依赖:Spring Boot 2.6.1 <dependency>
- ScrapySharp是一个帮助我们快速实现网页数据采集的库,它主要提供了如下两个功能从Url获取Html数据提供CSS选择器的方式解析Ht