Android T 实现简易的 USB Mode Select 需求

Android T 实现 USB Mode Select 需求

一、实现效果

在这里插入图片描述

二、主要实现思路

在手机连接 USB 发生/取消通知的同时,控制弹窗 Dialog 的显示/消失。

三、主要代码实现

连接 USB 发送/取消的主要实现是在 UsbDeviceManager.java 类中。类路径如下:

system/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

具体修改代码如下:

//add for bug start {
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.view.WindowManager;
import android.view.Gravity;
// add for bug end }/*** UsbDeviceManager manages USB state in device mode.*/
public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObserver {private static final String ADB_NOTIFICATION_CHANNEL_ID_TV = "usbdevicemanager.adb.tv";//add for bug start {private static UsbHandler mHandler;private static AlertDialog mServiceDialog = null;//add for bug end }private final Object mLock = new Object();protected void updateUsbNotification(boolean force) {if (mNotificationManager == null || !mUseUsbNotification|| ("0".equals(getSystemProperty("persist.charging.notify", "")))) {return;}// Dont show the notification when connected to a USB peripheral// and the link does not support PR_SWAP and DR_SWAPif (mHideUsbNotification && !mSupportsAllCombinations) {if (mUsbNotificationId != 0) {mNotificationManager.cancelAsUser(null, mUsbNotificationId,UserHandle.ALL);mUsbNotificationId = 0;Slog.d(TAG, "Clear notification");}return;}int id = 0;int titleRes = 0;Resources r = mContext.getResources();CharSequence message = r.getText(com.android.internal.R.string.usb_notification_message);if (mAudioAccessoryConnected && !mAudioAccessorySupported) {titleRes = com.android.internal.R.string.usb_unsupported_audio_accessory_title;id = SystemMessage.NOTE_USB_AUDIO_ACCESSORY_NOT_SUPPORTED;} ........} else if (mHostConnected && mSinkPower && (mUsbCharging || mUsbAccessoryConnected)) {titleRes = com.android.internal.R.string.usb_charging_notification_title;id = SystemMessage.NOTE_USB_CHARGING;}if (id != mUsbNotificationId || force) {// clear notification if title needs changingif (mUsbNotificationId != 0) {mNotificationManager.cancelAsUser(null, mUsbNotificationId,UserHandle.ALL);Slog.d(TAG, "Clear notification");mUsbNotificationId = 0;// add for bug start {if (mServiceDialog != null){mServiceDialog.dismiss();mServiceDialog = null;}// add for bug end }}// Not relevant for automotive and watch.if ((mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)|| mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH))&& id == SystemMessage.NOTE_USB_CHARGING) {mUsbNotificationId = 0;return;}if (id != 0) {CharSequence title = r.getText(titleRes);PendingIntent pi;String channel;........    Slog.d(TAG, "push notification:" + title);mUsbNotificationId = id;}}}// add for bug start {public void showDialog(Context context){final String USBModeStr[] = context.getResources().getStringArray(com.android.internal.R.array.spro_usb_mode);AlertDialog.Builder dialog = new AlertDialog.Builder(context);dialog.setTitle(context.getResources().getString(com.android.internal.R.string.usb_mode_tittle));dialog.setSingleChoiceItems(USBModeStr, 0 ,new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){Slog.d(TAG, "----------USBModeStr------------" + USBModeStr[which]);switch (which){case 1:mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, UsbManager.FUNCTION_MTP);break;case 2:mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, UsbManager.FUNCTION_PTP);break;default:mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, UsbManager.FUNCTION_NONE);break;}dialog.dismiss();}});dialog.setPositiveButton(context.getResources().getString(com.android.internal.R.string.usb_mode_cancel),new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {dialog.cancel();}});mServiceDialog = dialog.create();mServiceDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);mServiceDialog.getWindow().setGravity(Gravity.BOTTOM);if (mServiceDialog != null && !mServiceDialog.isShowing()) {mServiceDialog.show();}}// add for bug end }protected void updateAdbNotification(boolean force) {if (mNotificationManager == null) return;final int id = SystemMessage.NOTE_ADB_ACTIVE;if (isAdbEnabled() && mConnected) {if ("0".equals(getSystemProperty("persist.adb.notify", ""))) return;if (force && mAdbNotificationShown) {mAdbNotificationShown = false;mNotificationManager.cancelAsUser(null, id, UserHandle.ALL);}if (!mAdbNotificationShown) {Notification notification = AdbNotifications.createNotification(mContext,AdbTransportType.USB);mAdbNotificationShown = true;mNotificationManager.notifyAsUser(null, id, notification, UserHandle.ALL);// add for bug start {showDialog(mContext);// add for bug end }}} else if (mAdbNotificationShown) {mAdbNotificationShown = false;mNotificationManager.cancelAsUser(null, id, UserHandle.ALL);}}
}
3.2、添加 string 资源
添加英文资源

frameworks\base\core\res\res\values\strings.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">... ... <!--start usb mode by wj--><string name="usb_mode_tittle">Use USB for</string><string name="usb_mode_charging_only">Charging only</string><string name="usb_mode_mtp">File Transfer(MTP)</string><string name="usb_mode_ptp">Transfer Photos(PTP)</string><string name="usb_mode_cancel">Cancel</string><!--end usb mode by wj-->... ... 
</resources>

添加中文资源

frameworks\base\core\res\res\values-zh-rCN\strings.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">... ... <!--start usb mode by--><string name="usb_mode_tittle">USB 用途</string><string name="usb_mode_charging_only">仅限充电</string><string name="usb_mode_mtp">传输文件(MTP)</string><string name="usb_mode_ptp">传输照片(PTP)</string><string name="usb_mode_cancel">取消</string><!--end usb mode by -->... ... 
</resources>
3.3、添加引用的数组资源

因为3种 USB mode,引用了数组资源,所以需要在Framework层添加数组资源。

Framework中添加数组主要修改valuesarrays.xml文件frameworks\base\core\res\res\values\arrays.xml
添加内容如下:

</resources> ... ...<!-- add for bug start --><string-array name="spro_usb_mode"><item>@string/usb_mode_charging_only</item><item>@string/usb_mode_mtp</item><item>@string/usb_mode_ptp</item></string-array><!-- add for bug end -->
</resources>

3.4、修改Framwork 资源,需要添加symbol,否则无法引用

Framework中添加资源后,由于无法像Eclipse或者Androd Studio那样自动生成R.java文件,需要在symbols.xml文件中手动添加自己的资源文件名,否则会导致无法根据com.android.internal.R.**引用所需的字符串资源。
symbols.xml主要在valuse文件夹下,详细路径为frameworks\base\core\res\res\values\symbols.xml

添加内容如下:

<resources>... ... <!--start usb mode by wj--><java-symbol type="string" name="usb_mode_tittle" /><java-symbol type="string" name="usb_mode_charging_only" /><java-symbol type="string" name="usb_mode_mtp" /><java-symbol type="string" name="usb_mode_ptp" /><java-symbol type="string" name="usb_mode_cancel" /><java-symbol type="array" name="spro_usb_mode" /><!--end usb mode by wj-->... ... 
</resources>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/190476.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP实现文本框多行输入(类cl_gui_textedit)

参考文章&#xff1a;https://blog.csdn.net/SAPmatinal/article/details/130882962 先看效果&#xff0c;在输入框先来一段《赤壁赋》 然后点击 ‘保存输出’按钮&#xff0c;就能把输入内容从表里读取并输出来 源代码&#xff1a; *&-------------------------------…

【云备份项目总结】客户端篇

项目总结 整体回顾util.hppdata.hppcloud.hpp 代码 客户端的代码与服务端的代码实现有很多相似之处&#xff0c;我们也只编写一个简单的客户端代码。 整体回顾 客户端要实现的功能是&#xff1a;对指定文件夹中的文件自动进行备份上传。但是并不是所有的文件每次都需要上传&am…

css style、css color 转 UIColor

你能看过来&#xff0c;就说明这个问题很好玩&#xff01;IT开发是一个兴趣&#xff0c;更是一个挑战&#xff01;兴趣使你工作有热情。挑战使让你工作充满刺激拉满的状态&#xff01;我们日复一日年复一年的去撸代码&#xff0c;那些普普通通的功能代码&#xff0c;已经厌倦了…

AI 绘画 | Stable Diffusion 高清修复、细节优化

前言 在 Stable Diffusion 想要生成高清分辨率的图片。在文生图的功能里&#xff0c;需要设置更大的宽度和高度。在图生图的功能里&#xff0c;需要设置更大的重绘尺寸或者重绘尺寸。但是设置完更大的图像分辨率&#xff0c;需要更大显存&#xff0c;1024*1024的至少要电脑的空…

Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的&#xff0c;因为我们还处于开发阶段 当我们完成具体任务开发后&#xff0c;就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs&#xff0c;现在的web服务通常都是基于liunx操作系统…

11-13 周一 同济子豪兄CNN卷积神经网络学习记录

11-13 周一 同济子豪兄CNN卷积神经网络学习记录 时间版本修改人描述2023年11月13日14:02:14V0.1宋全恒新建文档2023年11月13日19:05:29V0.2宋全恒完成 大白话讲解卷积神经网络的学习 简介 为了深入理解CNN&#xff0c;进行B站 同济子豪兄深度学习之卷积神经网络的学习. 主要内…

Halcon WPF 开发学习笔记(3):WPF+Halcon初步开发

文章目录 前言在MainWindow.xaml里面导入Halcon命名空间WPF简单调用Halcon创建矩形简单调用导出脚本函数 正确显示匹配效果 前言 本章会简单讲解如何调用Halcon组件和接口&#xff0c;因为我们是进行混合开发模式。即核心脚本在平台调试&#xff0c;辅助脚本C#直接调用。 在M…

实验一 Anaconda安装和使用(Python程序设计实验报告)

实验一 Anaconda安装和使用 一、实验环境 Python集成开发环境IDLE/Anaconda 二、实验目的 1&#xff0e;掌握Windows下Anaconda的安装和配置。 2. 掌握Windows下Anaconda的简单使用&#xff0c;包括IDLE、Jupyter Notebook、Spyder工具的使用。 3. 掌握使用pip管理Python扩展库…

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

【入门Flink】- 08Flink时间语义和窗口概念

Flink-Windows 是将无限数据切割成有限的“数据块”进行处理&#xff0c;这就是所谓的“窗口”&#xff08;Window&#xff09;。 注意&#xff1a;Flink 中窗口并不是静态准备好的&#xff0c;而是动态创建——当有落在这个窗口区间范围的数据达到时&#xff0c;才创建对应的窗…

IDEA 关闭SpringBoot启动Logo/图标

一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…

OpenCV:图像噪点消除与滤波算法

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

【hcie-cloud】【3】华为云Stack规划设计之华为云Stack交付综述【上】

文章目录 前言华为云Stack交付综述交付流程华为云Stack交付流程华为云Stack安装部署流程 交付工具链华为云Stack交付工具链eDesigner - 让解决方案销售更智能eDesigner配置页面 - 基本信息eDesigner配置页面 - 服务及组网配置eDesigner配置页面 - 弹性云服务器/ECSeDesigner配置…

带头双向循环链表

文章目录 概述初始化销毁插入删除遍历打印 概述 带头双向循环链表&#xff1a;结构最复杂&#xff0c;一般用在单独存储数据。实际中使用的链表数据结构&#xff0c;都是带头双向循环链表。另外这个结构虽然结构复杂&#xff0c;但是使用代码实现以后会发现结构会带来很多优势…

11.读取文件长度-fseek和ftell函数的使用

文章目录 简介1. 写入测试文件2. 读取文件长度 简介 主要讲使用fopen读取文件&#xff0c;配合使用fseek和ftell来读取文件长度。1. 写入测试文件 执行下方程序&#xff0c;使用fwrite函数写入40字节的数据&#xff0c;使其形成文件存入本地目录。#define _CRT_SECURE_NO_WARNI…

CCF ChinaSoft 2023 论坛巡礼 | 编译技术与编译器设计论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

JVS低代码表单自定义按钮的使用说明和操作示例

在普通的表单设计中&#xff0c;虽然自带的【提交】、【重置】、【取消】按钮可以满足基本操作需求&#xff0c;但在面对更多复杂的业务场景时&#xff0c;这些按钮的显示控制就显得有些力不从心。为了更好地满足用户在表单操作过程中的个性化需求&#xff0c;JVS低代码推出了表…

接口测试--知识问答

1 做接口测试当请求参数多时tps下降明显&#xff0c;此接口根据参数从redis中获取数据&#xff0c;每个参数与redis交互一次&#xff0c;当一组参数是tps5133&#xff0c;五组参数是tps1169&#xff0c;多次交互影响了处理性能&#xff0c;请详细阐述如何改进增进效果的方案。 …

软件外包开发的需求表达方法

软件开发需求的有效表达对于项目的成功至关重要。无论选择哪种需求表达方法&#xff0c;清晰、详细、易于理解是关键。与开发团队建立良好的沟通渠道&#xff0c;确保他们对需求有充分的理解&#xff0c;并随着项目的推进及时调整和更新需求文档。以下是一些常用的需求表达方法…

Django下的Race Condition漏洞

目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包&#xff1a;GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…