android wear 2.0 表盘开发,android wear手表开发如何获取所有的表盘(动态)以及切换表盘...
获取到所有的表盘信息
关于表盘的获取,网上的资料也少,也只是怎么获取当前壁纸(表盘)。这里呢,就从思路上尝试去获取表盘。
思路:原理上来讲,表盘就是一个服务,动态壁纸,在后台不断地刷新。这样子的话,我们可以通过获取所有的服务,添加过滤即获取表盘。
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手表开发如何获取所有的表盘(动态)以及切换表盘...相关推荐
- android studio m1,Android Studio 4.0发布 为Android 11做好准备
新的 Motion 编辑器 MotionLayout API扩展了ConstraintLayout丰富的功能,可以帮助 Android 开发管理应用的复杂运动和 widget 动画,在 Android ...
- google android plc,Android Studio 4.0发布 为Android 11做好准备
新的 Motion 编辑器 MotionLayout API扩展了ConstraintLayout丰富的功能,可以帮助 Android 开发管理应用的复杂运动和 widget 动画,在 Android ...
- android retrofit 2.0公共参数,Android Retrofit 2.0 使用-补充篇
之前分享的Android Retrofit 2.0 使用,属于基本的使用,实际开发还远远不够,因此对其补充,主要在Retrofit配置和接口参数. Retrofit配置 添加依赖 app/build. ...
- android sina oauth2.0 code认证,Android通过第三方登录理解oauth2.0机制
1. OAuth2.0介绍 说到第三方登录,离不开oauth2.0,oauth2.0是"用户认证和授权的标准",是从oauth1.0基础上发展来的.下图是oauth2.0六个过程分 ...
- android sdk 5.0 安装教程,Android SDK 设置
Android SDK 设置 要在 Android 设备上构建并运行代码,首先必须遵循以下步骤.使用 Unity 或者从头开始编写 Android 应用程序均是如此. 1. 下载 Android SD ...
- Unity UMP Pro Android iOS 2.0.2 发布Android黑屏解决方法
首先遇到问题还是得好好读读文档. 1.按照链接设置好后进行下一步. 2.第一张图是文档里对Android的设置需求,具体对应参考第二张图片,然后打包app就播放了.我是卡在了ARMMv7这个选项没有勾 ...
- 谷歌手表android wear2,Android Wear 2.0正式发布:将谷歌助手放进你的手表
原标题:Android Wear 2.0正式发布:将谷歌助手放进你的手表 刚刚正式发布了Android Wear 2.0系统,带来了多项新功能,不妨一起来看一下. 首先,Android Wear 2. ...
- android wear 助手,Android Wear 2.0正式发布:将谷歌助手放进你的手表
谷歌刚刚正式发布了Android Wear 2.0系统,带来了多项新功能,不妨一起来看一下. 首先,Android Wear 2.0为用户界面带来的重大变化是常显表盘方面,现在用户可以自定义表盘显示的 ...
- 使用Kotlin开发Android应用初体验
使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之 ...
- 虚拟机VirtualBox安装Android x86 4.0冰激凌三明治系统
虚拟机VirtualBox安装Android x86 4.0冰激凌三明治系统 前段时间二黑给大家介绍了 Android SDK安装Android 4.0的方法,相信很多同学也试过了.用那种方法模拟的A ...
最新文章
- 云计算实训总结_云计算实习报告.doc
- Linux find查找文件夹(目录)所在位置
- C语言创建一个节点Node(附完整源码)
- MyBatis 架构分层与模块划分-基础支持层
- java hadoop_单元测试Java Hadoop作业
- uvm 形式验证_IC设计职位详解之“数字验证工程师”就业必学课程
- yii schema.mysql.sql_YII学习,初体验 ,对YII的一些理解.
- 光动能表怎么维护_男士手表什么牌子好,男士手表品牌推荐, 天梭、阿玛尼、西铁城、天王表、罗西尼、卡西欧男手表推荐...
- php任务奖励体系,phpwind7.5完备的积分体系
- mysql 设置一个字段为null_MySQL中,为什么要设置NOT NULL?
- 轻量级数据库sqlite的编译
- 强一致、高可用、自动容灾能力背后,阿里X-Paxos的应用实践
- atomic一定线程安全吗
- 听说这家云计算公司要搞事情
- Zephyr学习(一)Zephyr介绍
- 【总结】树状数组讲解+例题
- 三农数据(1996-2020)一:农村综合、乡村人口、文化程度、农村机械等
- 【Pandas】Pandas求某列字符串的长度,总结经验教训
- 数据分析与爬虫实战视频——学习笔记(二)(千图网图片爬虫、fiddler抓包分析、腾讯视频评论爬虫、多线程爬虫(糗百))
- 脱欧协议在英议会遇惨败:首相面临逼宫 欧盟表遗憾
热门文章
- 面向服务通信与面向信号通信
- 2021-06-16 srm平台电子化采购的优势
- 《雍正皇帝·九王夺嫡》社会文化专有词泰译研究(称谓)
- lammps复杂形状建模案例——胶囊粒子分子模型
- Visual Studio 类向导HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
- mysql rds 是什么_mysql.rds.aliyuncs.com
- 怎么把mp4转换成mp3?
- 关于silverlight的xap包与dll分离的一些事儿
- 笑一笑 悟空!你丫这泼猴!怎么还不来啊!
- Unity手势插件FingerGestures