获取到所有的表盘信息

关于表盘的获取,网上的资料也少,也只是怎么获取当前壁纸(表盘)。这里呢,就从思路上尝试去获取表盘。

思路:原理上来讲,表盘就是一个服务,动态壁纸,在后台不断地刷新。这样子的话,我们可以通过获取所有的服务,添加过滤即获取表盘。

1、拿到包管理器

2、通过包管理器去获取所有的服务,但是要添加过滤

3、还是看码吧,已经定了注释,相信聪明的你一定可以的

private void getAllWallpapers() {

//拿到包管理器

final PackageManager mPackageManager = getPackageManager();

//获取到包管理器(第二个参数过代表过滤形式,过滤形式有两种,一种是Intent,一种是Resolved)

List servicesLists = mPackageManager.queryIntentServices(new Intent(WallpaperService.SERVICE_INTERFACE),PackageManager.GET_META_DATA);

//获取到集合的长度

int size = servicesLists.size();

//创建一个用来保存壁纸信息的集合

mWallpaperInfos = new ArrayList<>(size);

//看看获取到的和手表上的表盘数量是否一样

Log.d(TAG, "size == " + size);

//遍历服务数据

for (int i = 0; i < size; i++) {

//集合内容

ResolveInfo resolveInfo = servicesLists.get(i);

//使用组件信息来创建壁纸服务,当然,也可以先不new,用的时候再New,反正已经获取到了嘛。

WallpaperInfo info;

try {

info = new WallpaperInfo(this, resolveInfo);

} catch (XmlPullParserException e) {

Log.w(TAG, "妈蛋,Xml解析错误... " + e.toString());

continue;

} catch (IOException e) {

Log.w(TAG, "妈蛋,IO异常呢.... " + e.toString());

continue;

}

//此处应有掌声.....

//把壁纸信息都添加到集合里头

mWallpaperInfos.add(info);

}

}

更换表盘

普通的壁纸切换的方法是公开的,权限的public的。

这是通过设置Bitmap的形式来设置壁纸

public void setBitmap(Bitmap bitmap) throws IOException {

....

这是通过设置流的形式来设置壁纸

public void setStream(InputStream data) throws IOException {

......

}

这是设置资源文件的形式来设置壁纸

public void setResource(@RawRes int resid) throws IOException {

.....

}

貌似就是这几个了哈,具体请看WallpaperManager这个类。

那么设置动态壁纸呢,是私有的,并且是隐藏的,并并且是系统的api。在WallpaperManager类里可以找到如下代码:

/**

* Set the live wallpaper.

* 设置动态壁纸

* This can only be called by packages with android.permission.SET_WALLPAPER_COMPONENT

* permission.

* 这只能被有更换权限的包(app)调用。

* @hide(隐藏)

*/

@SystemApi(系统api)

public boolean setWallpaperComponent(ComponentName name) {

if (sGlobals.mService == null) {

Log.w(TAG, "WallpaperService not running");

return false;

}

try {

sGlobals.mService.setWallpaperComponentChecked(name, mContext.getOpPackageName());

return true;

} catch (RemoteException e) {

// Ignore

}

return false;

}

这个方法是隐藏的,我们可以通过反射方法去调用,参数嘛,前面我们已经准被好了表盘的信息,只有小手一抖就可以获取到ComponentName了。

ComponentName component = wallpaperInfo.getComponent();

重点来了:这个方法有Android Wear里有,也就是用模拟器的时候,可以获取到这个方法。但是,在百度的系统更里头,获取不到,会报NoSuchMethodException异常。

所以,我们在百度系统里就不能用这种方法了。可能它阉割掉了。反正实验结果就是:Android Wear原生系统可以获取到这个方法,而百度的系统上获取不到。

我们看看setWallpaperComponent这个方法它做了什么事呢?其实它呢,核心代码就一句:

sGlobals.mService.setWallpaperComponentChecked(name, mContext.getOpPackageName());

这里的mService是何方神圣呢?点进去看一看!

private IWallpaperManager mService;

原来这个mService是IwallpapaerManager,看到这里应该很熟悉了吧,是吧。这肯定是一个接口,它呢,用于连接修改表盘的服务。

更进一步来说,我们不通过上面这个方法来设置壁纸,直接使用接口里的方法来设置。接口的源码如下:

/** @hide */

interface IWallpaperManager {

......

/**

* Set the live wallpaper.

*/

void setWallpaperComponent(in ComponentName name);

........

}

它还是hide的,同理通过反射就可以获取到了是吧,然后就可以设置动态壁纸啦!

这个在百度的duware系统上可以哈,亲测可用!

/*这里通过反射,去获取到这个getIWallpaperManager()的方法,返回一个IWallpaperManager实例

后面作为实例扔到invoke里头。

*/

receiver = (IWallpaperManager) mWallpaperManager

.getClass()

.getMethod("getIWallpaperManager", new Class[0])

.invoke(mWallpaperManager, new Object[0]);

/*这里通过反射获取到setWallpaperComponent方法,来设置壁纸,实例对象就是这玩意啦*/

Class.forName("android.app.IWallpaperManager")

.getMethod("setWallpaperComponent", new Class[]{ComponentName.class})

.invoke(receiver, new Object[]{component});

好啦,到这里的话,你以为设置动态壁纸就搞定了,不是的哈,还有权限呢?

设置壁纸的权限

前面我们也看到了,修改动态壁纸是系统的API,也就是说这个需要系统的权限,在这个app的配置文件里添加了权限,还不行呢。还要对它进行系统签名,才真正有这样的权限去修改动态壁纸。

在配置文件里添加这个权限,我们可以看源码嘛,第一句话就是检查权限:

public void setWallpaperComponent(ComponentName name) {

checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);

synchronized (mLock) {

if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);

int userId = UserHandle.getCallingUserId();

WallpaperData wallpaper = mWallpaperMap.get(userId);

if (wallpaper == null) {

throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);

}

final long ident = Binder.clearCallingIdentity();

try {

wallpaper.imageWallpaperPending = false;

bindWallpaperComponentLocked(name, false, true, wallpaper, null);

} finally {

Binder.restoreCallingIdentity(ident);

}

}

}

有了权限之后,我们还需要进行系统签名,步骤如下:

1、生成APK,是APK就行了,有沒有签名都可以;

2、准备好这几个文件:

其中,第一第二个是秘钥文件,这是系统的签名文件,这里的话,它是百度系统的签名。也就是说

用它签名后,就有权限在百度系统上的权限。但是,在Android Wear原生系统上是用不了哦!

然后,把APK复制到上面文件的文件夹里头,然后打开CMD,切换到上面文件夹下:

执行: java -jar signapk.jar platform..x509.pem plantform.pk8 应用名字.apk 签名后的名字.apk

好啦,到这里的话,就可以了。

android wear 2.0 表盘开发,android wear手表开发如何获取所有的表盘(动态)以及切换表盘...相关推荐

  1. android studio m1,Android Studio 4.0发布 为Android 11做好准备

    新的 Motion 编辑器 MotionLayout API扩展了ConstraintLayout丰富的功能,可以帮助 Android 开发管理应用的复杂运动和 widget 动画,在 Android ...

  2. google android plc,Android Studio 4.0发布 为Android 11做好准备

    新的 Motion 编辑器 MotionLayout API扩展了ConstraintLayout丰富的功能,可以帮助 Android 开发管理应用的复杂运动和 widget 动画,在 Android ...

  3. android retrofit 2.0公共参数,Android Retrofit 2.0 使用-补充篇

    之前分享的Android Retrofit 2.0 使用,属于基本的使用,实际开发还远远不够,因此对其补充,主要在Retrofit配置和接口参数. Retrofit配置 添加依赖 app/build. ...

  4. android sina oauth2.0 code认证,Android通过第三方登录理解oauth2.0机制

    1. OAuth2.0介绍 说到第三方登录,离不开oauth2.0,oauth2.0是"用户认证和授权的标准",是从oauth1.0基础上发展来的.下图是oauth2.0六个过程分 ...

  5. android sdk 5.0 安装教程,Android SDK 设置

    Android SDK 设置 要在 Android 设备上构建并运行代码,首先必须遵循以下步骤.使用 Unity 或者从头开始编写 Android 应用程序均是如此. 1. 下载 Android SD ...

  6. Unity UMP Pro Android iOS 2.0.2 发布Android黑屏解决方法

    首先遇到问题还是得好好读读文档. 1.按照链接设置好后进行下一步. 2.第一张图是文档里对Android的设置需求,具体对应参考第二张图片,然后打包app就播放了.我是卡在了ARMMv7这个选项没有勾 ...

  7. 谷歌手表android wear2,Android Wear 2.0正式发布:将谷歌助手放进你的手表

    原标题:Android Wear 2.0正式发布:将谷歌助手放进你的手表 刚刚正式发布了Android Wear 2.0系统,带来了多项新功能,不妨一起来看一下. 首先,Android Wear 2. ...

  8. android wear 助手,Android Wear 2.0正式发布:将谷歌助手放进你的手表

    谷歌刚刚正式发布了Android Wear 2.0系统,带来了多项新功能,不妨一起来看一下. 首先,Android Wear 2.0为用户界面带来的重大变化是常显表盘方面,现在用户可以自定义表盘显示的 ...

  9. 使用Kotlin开发Android应用初体验

    使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之 ...

  10. 虚拟机VirtualBox安装Android x86 4.0冰激凌三明治系统

    虚拟机VirtualBox安装Android x86 4.0冰激凌三明治系统 前段时间二黑给大家介绍了 Android SDK安装Android 4.0的方法,相信很多同学也试过了.用那种方法模拟的A ...

最新文章

  1. 云计算实训总结_云计算实习报告.doc
  2. Linux find查找文件夹(目录)所在位置
  3. C语言创建一个节点Node(附完整源码)
  4. MyBatis 架构分层与模块划分-基础支持层
  5. java hadoop_单元测试Java Hadoop作业
  6. uvm 形式验证_IC设计职位详解之“数字验证工程师”就业必学课程
  7. yii schema.mysql.sql_YII学习,初体验 ,对YII的一些理解.
  8. 光动能表怎么维护_男士手表什么牌子好,男士手表品牌推荐, 天梭、阿玛尼、西铁城、天王表、罗西尼、卡西欧男手表推荐...
  9. php任务奖励体系,phpwind7.5完备的积分体系
  10. mysql 设置一个字段为null_MySQL中,为什么要设置NOT NULL?
  11. 轻量级数据库sqlite的编译
  12. 强一致、高可用、自动容灾能力背后,阿里X-Paxos的应用实践
  13. atomic一定线程安全吗
  14. 听说这家云计算公司要搞事情
  15. Zephyr学习(一)Zephyr介绍
  16. 【总结】树状数组讲解+例题
  17. 三农数据(1996-2020)一:农村综合、乡村人口、文化程度、农村机械等
  18. 【Pandas】Pandas求某列字符串的长度,总结经验教训
  19. 数据分析与爬虫实战视频——学习笔记(二)(千图网图片爬虫、fiddler抓包分析、腾讯视频评论爬虫、多线程爬虫(糗百))
  20. 脱欧协议在英议会遇惨败:首相面临逼宫 欧盟表遗憾

热门文章

  1. 面向服务通信与面向信号通信
  2. 2021-06-16 srm平台电子化采购的优势
  3. 《雍正皇帝·九王夺嫡》社会文化专有词泰译研究(称谓)
  4. lammps复杂形状建模案例——胶囊粒子分子模型
  5. Visual Studio 类向导HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
  6. mysql rds 是什么_mysql.rds.aliyuncs.com
  7. 怎么把mp4转换成mp3?
  8. 关于silverlight的xap包与dll分离的一些事儿
  9. 笑一笑 悟空!你丫这泼猴!怎么还不来啊!
  10. Unity手势插件FingerGestures