Yota3墨水屏投屏
Yota3手机墨水屏的发现页面仅提供了有限的号称经过优化的直通App,对于没提供直通投屏的App,想要投屏,得用工程模式或者是第三方提供的App。
工程模式(拨号命令方法)
拨号盘输入“ ##9738## ”。
点击“Mirror模式“
点击启动“Mirror”,彩色屏会黑屏
翻转到墨水屏即完成了投射,但是显示是停止投屏的显示,只需要按返回键就回到桌面了
要停止投屏,按电源键锁屏,在解开自动停止投屏模式。
more shortcuts快捷键方式
下载并安装 more shortcuts软件(请自行百度)。安装完后,在桌面添加小工具,在选择more shortcuts,然后“Activity”,找到工程模式,点击在弹出的选项中选择“工程模式 MirrorAcitivity”就行,当然可以修改快键键的图标和名称啊。
App快捷方式
App快捷方式会自动替换墨水屏的新华社这个直通应用。
安装完成后通过直通应用找到新华社,点击,会进入App快捷方式,通过App快捷方式能打开任意应用。
PS:如果找不到新华社,将手机升级到最新版
App快捷方式提供了已安装应用列表供启动,其缺点是应用太多时列表太长查询不方便,对于双开应用方法无效。
墨水屏app
墨水屏app采用自开发启动器方式,
墨水屏app存在开发bug一直没解决:使用一段时间莫名其妙所有app图标变大,通过清除数据卸载重装偶尔能解决。
开发研究
开发原理
墨水发现提供了许多直通app,如果该应用在彩屏界面已经安装,否则提示请先在彩色屏安装该应用,也就是说,直通应用仅仅提供了一个app接口,如果我们的程序能模拟某个直通应用跟这个接上,那就可以在直通应用中点击该app后跳转但我们的程序。基于该原理,网上有人开发了App快捷方式这个应用替换新华社这个新闻App,并在快捷方式程序中提供非直通程序启动链接,从而达到非直通应用投屏功能。
为了能让我们的程序替换直通应用现有程序,我们首先要弄清楚直通应用提供的接口。以替换直通应用雪球应用为例,我们先在彩屏界面安装 雪球App,然后 通过程序获得该App的程序包名 com.xueqiu.android,我们用该包名自己开发一个App,把手机中的 雪球应用卸载。装上我们自己开发的App,墨水屏中点击 雪球App按钮,成功跳转到我自己开发的App。
开发过程
- 获得手机中应用列表
查询手机中应用列表可以用PackageManager的getInstalledApplications获得手机中所有安装的应用,代码如下:
private void queryInstalledApp() {
PackageManager pm = this.getPackageManager();
// 查询所有已经安装的应用程序
//List<ApplicationInfo> appInfos= pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的
List<ApplicationInfo> appInfos= pm.getInstalledApplications(0);
for (ApplicationInfo app:appInfos) {
Log.i("inst",app.packageName+":"+app.loadLabel(pm).toString());
}
}
运行后在log中输出包名和app名称。
也可以用PackageManage的queryIntentActivities方法遍历,得到所有能打开的app,代码如下:
private void queryActApp() {
// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
List<ResolveInfo> resolveinfoList = getPackageManager()
.queryIntentActivities(resolveIntent, 0);
for (ResolveInfo resolveInfo:resolveinfoList){
Log.i("res",resolveInfo.activityInfo.packageName);
}
}
- 应用跳转
已知应用包名和启动类名, 跳转时,可用intent的setClassName方法,或者setComponent,代码如下:
public void tosecond(View view) {
Intent toset = new Intent();
toset.setClassName("com.example.administrator.oneapplication", "com.example.administrator.oneapplication.MainActivity");
//toset.setComponent(new //ComponentName("com.example.administrator.oneapplication", //"com.example.administrator.oneapplication.MainActivity"));
startActivity(toset);
}
如果不知道app的启动class,可以用getPackageManager().getLaunchIntentForPackage获得,代码如下:
public void onShanbeiClick()
{
String packageName="com.shanbay.news";
//PackageInfo packageInfo = null;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent =this.getPackageManager().getLaunchIntentForPackage(packageName);
if(intent!=null){
startActivity(intent);
}
//finish();
}