android蓝牙程序开发中,如何确定一台手机当前是服务器还是客户端

android蓝牙程序开发中,如何确定一台手机当前是服务器还是客户端,第1张

首先,要 *** 作蓝牙,先要在AndroidManifestxml里加入权限
<uses-permissionandroid:name="androidpermissionBLUETOOTH_ADMIN" />
<uses-permissionandroid:name="androidpermissionBLUETOOTH" />
然后,看下api,Android所有关于蓝牙开发的类都在androidbluetooth包下。 而需要用到了就只有几个而已:
1BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断 *** 作它BluetoothAdapter里的方法很多,常用的有以下几个:cancelDiscovery() 根据字面意思,是取消发现,也就是说正在搜索设备的时候调用这个方法将不再继续搜索disable()关闭蓝牙enable()打开蓝牙,这个方法打开蓝牙不会d出提示,更多的时候需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:Intemtenabler=new Intent(BluetoothAdapterACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
getAddress()获取本地蓝牙地址getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdaptergetName()获取本地蓝牙名称getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)isDiscovering()判断当前是否正在查找设备,是返回trueisEnabled()判断蓝牙是否打开,已打开返回true,否则,返回falselistenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步startDiscovery()开始搜索,这是搜索的第一步。 2BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket
这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter;
3BluetoothServerSocket如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,这个类一种只有三个方法
两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行。
还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接。
4BluetoothSocket,跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到close(),关闭connect()连接getInptuStream()获取输入流getOutputStream()获取输出流getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备 。

ArrayList list = new ArrayList();// 这个arraylist是可以直接在bundle里传的,所以我们可以借用一下它的功能 listadd(curGift);// 这个list2才是你真正想要传过去的list。我们把它放在arraylis中,借助它传过去 bundleputParcelableArrayList(INTENT_GIFT, list); intentputExtras(bundle); startActivity(intent);一直不用实现Serializable 也可以传递list的方法

JPush SDK 收到推送,通过广播的方式,转发给开发者App,这样开发者就可以灵活地进行处理。
这个动作不是必须的。用户有需要才定义 Receiver 类来处理 SDK过来的广播。
如果不做这个动作,即不写自定义 Receiver,也不在 AndroidManifestxml 里配置这个 Receiver,则默认的行为是:
接收到推送的自定义消息,则没有被处理
可以正常收到通知,用户点击打开应用主界面
接受广播
如果全部类型的广播都接收,则需要在 AndroidManifestxml 里添加如下的配置信息:
<receiver
android:name="Your Receiver"
android:enabled="true">
<intent-filter>
<action android:name="cnjpushandroidintentREGISTRATION" />
<action android:name="cnjpushandroidintentMESSAGE_RECEIVED" />
<action android:name="cnjpushandroidintentNOTIFICATION_RECEIVED" />
<action android:name="cnjpushandroidintentNOTIFICATION_OPENED" />

<category android:name="You package Name" />
</intent-filter>
</receiver>
每个 Receiver action 详细解释如下。
Action - cnjpushandroidintentREGISTRATION
SDK 向 JPush Server 注册所得到的注册 ID 。
一般来说,可不处理此广播信息。
要深入地集成极光推送,开发者想要自己保存App用户与JPush 用户关系时,则接受此广播,取得 Registration ID 并保存与App uid 的关系到开发者自己的应用服务器上。
使用极光推送提供的别名与标签功能,是更加简单轻便的绑定App用户与JPush用户的方式,请参考文档:别名与标签使用教程。
Intent 参数
JPushInterfaceEXTRA_REGISTRATION_ID
SDK 向 JPush Server 注册所得到的注册 全局唯一的 ID ,可以通过此 ID 向对应的客户端发送消息和通知。
Bundle bundle = intentgetExtras();
String title = bundlegetString(JPushInterfaceEXTRA_REGISTRATION_ID);
Action - cnjpushandroidintentMESSAGE_RECEIVED
收到了自定义消息 Push 。
SDK 对自定义消息,只是传递,不会有任何界面上的展示。
如果开发者想推送自定义消息 Push,则需要在 AndroidManifestxml 里配置此 Receiver action,并且在自己写的 BroadcastReceiver 里接收处理。
Intent 参数
JPushInterfaceEXTRA_TITLE
保存服务器推送下来的消息的标题。
对应 API 消息内容的 title 字段
对应 Portal 推送消息界面上的“标题”字段(可选)
Bundle bundle = intentgetExtras();
String title = bundlegetString(JPushInterfaceEXTRA_TITLE);
JPushInterfaceEXTRA_MESSAGE
保存服务器推送下来的消息内容。
对应 API 消息内容的 message 字段。
对应 Portal 推送消息界面上的"消息内容”字段。
Bundle bundle = intentgetExtras();
String message = bundlegetString(JPushInterfaceEXTRA_MESSAGE);
JPushInterfaceEXTRA_EXTRA
保存服务器推送下来的附加字段。这是个 JSON 字符串。
对应 API 消息内容的 extras 字段。
对应 Portal 推送消息界面上的“自定义内容”。
Bundle bundle = intentgetExtras();
String extras = bundlegetString(JPushInterfaceEXTRA_EXTRA);
JPushInterfaceEXTRA_CONTENT_TYPE
保存服务器推送下来的内容类型。
对应 API 消息内容的 content_type 字段。
Bundle bundle = intentgetExtras();
String type = bundlegetString(JPushInterfaceEXTRA_CONTENT_TYPE);
JPushInterfaceEXTRA_RICHPUSH_FILE_PATH
SDK 140 以上版本支持。
富媒体通消息推送下载后的文件路径和文件名。
Bundle bundle = intentgetExtras();
String file = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_FILE_PATH);
JPushInterfaceEXTRA_MSG_ID
SDK 161 以上版本支持。
唯一标识消息的 ID, 可用于上报统计等。
Bundle bundle = intentgetExtras();
String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);
Action - cnjpushandroidintentNOTIFICATION_RECEIVED
收到了通知 Push。
如果通知的内容为空,则在通知栏上不会展示通知。但是,这个广播 Intent 还是会有。开发者可以取到通知内容外的其他信息。
Intent 参数
JPushInterfaceEXTRA_NOTIFICATION_TITLE
保存服务器推送下来的通知的标题。
对应 API 通知内容的 n_title 字段。
对应 Portal 推送通知界面上的“通知标题”字段。
Bundle bundle = intentgetExtras();
String title = bundlegetString(JPushInterfaceEXTRA_NOTIFICATION_TITLE);
JPushInterfaceEXTRA_ALERT
保存服务器推送下来的通知内容。
对应 API 通知内容的 n_content 字段。
对应 Portal 推送通知界面上的“通知内容”字段。
Bundle bundle = intentgetExtras();
String content = bundlegetString(JPushInterfaceEXTRA_ALERT);
JPushInterfaceEXTRA_EXTRA
SDK 129 以上版本支持。
保存服务器推送下来的附加字段。这是个 JSON 字符串。
对应 API 通知内容的 n_extras 字段。
对应 Portal 推送通知界面上的“自定义内容”字段。
Bundle bundle = intentgetExtras();
String extras = bundlegetString(JPushInterfaceEXTRA_EXTRA);
JPushInterfaceEXTRA_NOTIFICATION_ID
SDK 135 以上版本支持。
通知栏的Notification ID,可以用于清除Notification
Bundle bundle = intentgetExtras();
int notificationId = bundlegetInt(JPushInterfaceEXTRA_NOTIFICATION_ID);
JPushInterfaceEXTRA_CONTENT_TYPE
保存服务器推送下来的内容类型。
对应 API 消息内容的 content_type 字段。
Portal 上暂时未提供输入字段。
Bundle bundle = intentgetExtras();
String type = bundlegetString(JPushInterfaceEXTRA_CONTENT_TYPE);
JPushInterfaceEXTRA_RICHPUSH_HTML_PATH
SDK 140 以上版本支持。
富媒体通知推送下载的HTML的文件路径,用于展现WebView。
Bundle bundle = intentgetExtras();
String fileHtml = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_HTML_PATH);
JPushInterfaceEXTRA_RICHPUSH_HTML_RES
SDK 140 以上版本支持。
富媒体通知推送下载的资源的文件名,多个文件名用 “,” 分开。 与 “JPushInterfaceEXTRA_RICHPUSH_HTML_PATH” 位于同一个路径。
Bundle bundle = intentgetExtras();
String fileStr = bundlegetString(JPushInterfaceEXTRA_RICHPUSH_HTML_RES);
String[] fileNames = fileStrspilt(",");
JPushInterfaceEXTRA_MSG_ID
SDK 161 以上版本支持。
唯一标识通知消息的 ID, 可用于上报统计等。
Bundle bundle = intentgetExtras();
String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);
Action - cnjpushandroidintentNOTIFICATION_OPENED
用户点击了通知。
一般情况下,用户不需要配置此 receiver action。
如果开发者在 AndroidManifestxml 里未配置此 receiver action,那么,SDK 会默认打开应用程序的主 Activity,相当于用户点击桌面图标的效果。
如果开发者在 AndroidManifestxml 里配置了此 receiver action,那么,当用户点击通知时,SDK 不会做动作。开发者应该在自己写的 BroadcastReceiver 类里处理,比如打开某 Activity 。
Intent 参数
JPushInterfaceEXTRA_NOTIFICATION_TITLE
保存服务器推送下来的通知的标题。
对应 API 通知内容的 n_title 字段。
对应 Portal 推送通知界面上的“通知标题”字段。
Bundle bundle = intentgetExtras();
String title = bundlegetString(JPushInterfaceEXTRA_NOTIFICATION_TITLE);
JPushInterfaceEXTRA_ALERT
保存服务器推送下来的通知内容。
对应 API 通知内容的n_content字段。
对应 Portal 推送通知界面上的“通知内容”字段。
Bundle bundle = intentgetExtras();
String content = bundlegetString(JPushInterfaceEXTRA_ALERT);
JPushInterfaceEXTRA_EXTRA
SDK 129 以上版本支持。
保存服务器推送下来的附加字段。这是个 JSON 字符串。
对应 API 消息内容的 n_extras 字段。
对应 Portal 推送通知界面上的“自定义内容”字段。
Bundle bundle = intentgetExtras();
String type = bundlegetString(JPushInterfaceEXTRA_EXTRA);
JPushInterfaceEXTRA_NOTIFICATION_ID
SDK 135 以上版本支持。
通知栏的Notification ID,可以用于清除Notification
Bundle bundle = intentgetExtras();
int notificationId = bundlegetInt(JPushInterfaceEXTRA_NOTIFICATION_ID
JPushInterfaceEXTRA_MSG_ID
SDK 161 以上版本支持。
唯一标识调整消息的 ID, 可用于上报统计等。
Bundle bundle = intentgetExtras();
String file = bundlegetString(JPushInterfaceEXTRA_MSG_ID);
代码示例
public void onReceive(Context context, Intent intent) {
Bundle bundle = intentgetExtras();
Logd(TAG, "onReceive - " + intentgetAction());

if (JPushInterfaceACTION_REGISTRATION_IDequals(intentgetAction())) {

} else if (JPushInterfaceACTION_MESSAGE_RECEIVEDequals(intentgetAction())) {
Systemoutprintln("收到了自定义消息。消息内容是:" + bundlegetString(JPushInterfaceEXTRA_MESSAGE));
// 自定义消息不会展示在通知栏,完全要开发者写代码去处理
} else if (JPushInterfaceACTION_NOTIFICATION_RECEIVEDequals(intentgetAction())) {
Systemoutprintln("收到了通知");
// 在这里可以做些统计,或者做些其他工作
} else if (JPushInterfaceACTION_NOTIFICATION_OPENEDequals(intentgetAction())) {
Systemoutprintln("用户点击打开了通知");
// 在这里可以自己写代码去定义用户点击后的行为
Intent i = new Intent(context, TestActivityclass); //自定义打开的界面
isetFlags(IntentFLAG_ACTIVITY_NEW_TASK);
contextstartActivity(i);

} else {
Logd(TAG, "Unhandled intent - " + intentgetAction());
}
}

Android 调试桥 (adb)  ,可与设备进行通信。adb 命令可用于执行各种设备 *** 作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

客户端: 用于发送命令。客户端在开发机器上运行。可以通过发出 adb 命令从命令行终端调用客户端。(可以通过它对Android应用进行安装、卸载、调试)

PC上的手机助手基本都是通过adb命令去完成的。有时候装了这类手机助手的话,它自带的adb程序可能会与Android SDK下的adb程序产生冲突,5037端口被占用,导致adb命令无法连接到设备。Windows下通过netstat -ano|findstr "5037"

守护程序 (adbd): 用于在设备上运行命令。守护程序在每个设备上作为后台进程运行

执行adb shell ps | grep adbd, 可以找到该后台进程,Windows使用findstr替代grep

adb nodaemon server

服务器(Service): 用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行

adb服务启动后,Windows可以在任务管理中找到adbexe; linux ps -ef | gref adb 可以查看service

一般都是通过这样子的格式 adb [-d|-e|-s <设备序列号>] <子命令>

通常只有一台设备就忽略 [-d|-e|-s ] 这一部分

这里介绍一些常用的命令:

获取设备列表及设备状态

获取设备的状态

注意:设备的状态有 3 钟,device , offline , unknown

device:设备正常连接

offline:连接出现异常,设备无响应

unknown:没有连接设备

 结束 adb 服务

 启动 adb 服务

注意:通常两个命令一起用,有时候我们开启server会失败,这是因为我们装了的手机助手,豌豆荚或者其他软件自带有自己的adb,导致端口冲突开启失败。一般在连接出现异常,使用 adb devices 未正常列出设备, 设备状态异常时使用 kill-server,然后运行 start-server 进行重启服务。

打印 Android 的系统日志

 打印 dumpsys、dumpstate、logcat 的输出,也是用于分析错误输出比较多

打印日志后重定向到一个文件中

 安装应用,覆盖安装是使用 -r 选项
注意:有些adb版本无法支持安装中文的apk

查看手机应用包名

查看应用对应的apk文件在手机上的安装位置则可以在上面的命令后加-f参数

卸载应用,后面跟的参数是应用的包名,请区别于 apk 文件名

'-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存目录

 将 Android 设备上的文件或者文件夹复制到本地

adb pull /sdcard/testtxt C:\Users\Administrator\Desktop\log
推送本地文件至 Android 设备

获取连接到的手机的序列号

获取设备的连接状态

等待设备连接成功

该命令将会阻塞一直到默认连接的那部机器状态变为device,也就是连接成功。

其实adb shell命令就是调用的是Android设备中的system/bin目录下的命令。

Android的内核本身就是Linux,所以Android本身也支持Linux命令,但是因为是手机系统,所以进行了一定的删减,部分命令不支持,而不支持的部分,我们可以通过安装busybox这个软件进行。

如何在手机中执行Shell命令?

  每次都加上adb shell来进行命令的发送与执行

 先通过adb shell进入手机Shell执行状态,然后直接输入Linux命令。
使一个apk处于禁用状态,相当于卸载了:

其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 comUCMobile/mainUCMobile

eg:adb shell su disable comUCMobile/mainUCMobile

同时我们在手机上发现,UC浏览器的图标不见了

让一个apk从禁用状态恢复过来

其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 comUCMobile/mainUCMobileeg:

adb shell su enable comUCMobile/mainUCMobile

同时我们从手机上发现,UC浏览器的图标又出现了。

查看一个apk所在的路径

adb shell pm path comUCMobile

查看手机中装的所有的包

屏幕开始录像并且储存到/sdcard中,同时名字为demomp4

录屏设置时长10s,命名为demomp4

注意:现在仅支持一部分手机录屏,不支持的手机会出现以下提示

解决方法:

安装了scrcpy之后,只需要输入如下命令,即可录取指定设备的屏幕

scrcpy -s device --render-expired-frames -Nr /demopm4

--render-expired-frames:尽可能最大帧率

-N:不在PC端展示

-r:录制mp4/mkv文件

关闭设备请求,开启设备

设备关机以及重启

pm(package manager)可以获取一些安装到Android设备上的app的信息

pm list packages 用法:list packages [ options] filter

获取所有的应用的包名

列出系统应用
列出第三方应用
查看它们的关联文件

adb shell pm list package -f

查看软件包的安装来源

pm dump 包名 很多dump信息

安装应用

apk如果在电脑用 adb install 

如果在Android设备上用 adb shell pm install

卸载应用,同adb uninstall ,后跟包名

清除应用数据

am(activity manager,字面意思就跟activity有关,大家都知道Android的界面都是由一个个activity显示的)

启动一个Activity

获取到package和launch_activity

AndroidSDK中aapt工具,检索命令结果,可以获取到package和launch_activity

这里涉及到一个点,如何找到程序的入口,首先你要知道是哪个activity才能启动;

启动华为系统相机

打开音乐播放器

播放指定音乐:

先停止目标应用,再启动

等待应用完成启动

启动网页(androidintentactionVIEW具体参考Android官网)

结束应用

input

模拟输入,向获得焦点的EditText控件输入内容

返回主界面

发送一个点击 *** 作的指令,参数是<x> <y>坐标

从左往右滑动屏幕, /从 100 100 经历300毫秒滑动到 200 200

长按 *** 作,在 100 100 位置长按 1000毫秒


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/13435734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-05
下一篇 2023-08-05

发表评论

登录后才能评论

评论列表(0条)

保存