手机里有设为预设应用程式是什么意思

新手学堂010

手机里有设为预设应用程式是什么意思,第1张

手机里有设为预设应用程式是什么意思

预设应用程式的意思是您开启某一个应用固定使用某个程式开启

比如您手机里装有多个浏览器如果您把UC浏览器设定为预设后

下次开启网页连结的时候就预设使用UC浏览器开启

就不需要重复进行选择了

手机里结束应用程式是什么意思

结束不是解除安装的意思 意思是停止其软体程式执行中止

自带的软体 如果没ROOM得到最高许可权 是无法解除安装系统自带软体的

最高许可权的话 刷机

三星s7没有设定为预设的应用程式 是什么意思

如需清除某软体的预设设定,请您:设定-(一般/更多)-应用程式管理器-全部-找到正在预设使用的应用程式-清除预设值。

手机克隆应用程式是什么意思

就是指现在的很多的手机APP存在一些漏洞,腾讯安全玄武实验室不是就检测出来了么,这种克隆的漏洞,可以轻松“克隆”使用者账户,窃取隐私资讯,基于该模型,腾讯安全玄武实验室以某个常被厂商忽略的安全问题进行检查,在200个移动应用中发现27个存在漏洞,比例超过10%。在发现这些漏洞之后,通过CNCERT向厂商报告了相关漏洞,并提供了修复方法

应用程式是什么意思?

应用程式是使用者选择安装的程式的总称,通常包括驱动程式的程序,看图软体、解压缩软体等通用软体的程序也可以顾名思义地说:应用程式就是为使用者提供与电脑沟通所开发出来的程式软体

应用程式,是指为完成某项或多项特定工作的计算机程式,它执行在使用者模式,可以和使用者进行互动,具有可视的使用者介面。

计算机分好多层:硬体、作业系统、编译程式、各种语言工具包、应用程式,其中作业系统编译程式各种语言工具包是属于系统程式的范畴,驱动程式也属于系统程式,而基于系统软体之上的,为使用者提供服务的都可以看成应用程式,而一些和系统相关的软体则属于系统软体,如:作业系统、驱动程式和系统一些管理维护的软体 等等,应用软体是相对于系统软体来说的。

没有设定预设置程式是什么意思

作为多使用者作业系统,每一个登入的使用者都会预设在 %USERPROFILE%\Local Settings\ 建立一个与登入名同名的目录,用来储存我的文件、桌面、收藏夹、应用程式设定等资料。但使用者个人配置档案预设储存在系统分割槽。因为各种原因要重新安装作业系统,在重新安装时会格式化系统分割槽(预设C盘)。之后恢复资料。

因为每过一段时间,就要重新安装作业系统。怎样最终解决这个问题呢?

我的一个思路是:

①在计算机C分割槽上,安装Windows XP(或Windows 2000),安装应用程式、设定。

② 建立使用者,并登入。

③ 修改此使用者的预设配置资料夹,使其重定义到另一分割槽如D盘。

④ 修改“新建使用者”的预设配置资料夹,使其重定义到另一分割槽如D盘。

⑤ 安装“虚拟启动软盘”程式,此虚拟软盘中带ghost程式。

⑥ 重新启动计算机,使用“虚拟启动软盘” 中的ghost克隆C分割槽到D盘。

⑦ 使用计算机若干时间,在“桌面、我的文件”中储存资料,收发邮件等都储存在预设配置档案(修改后的D分割槽中相应目录。

⑧ 新建使用者的配置档案也会储存在D盘。

⑨ 出现问题后,使用ghost从映象恢复即可。

说明

修改使用者配置档案的方法:

一、

①若修改使用者名称为abc,则用abc登入,右击“我的电脑->属性->高阶->环境变数->”abc的使用者变数“下单击”新建“按钮,变数名为USERPROFILE,变数值为d:\abc。单击”新建“按钮,变数名为HOMEPATH,变数值为d:\abc。单击”确定“按钮返回。

② 再次登入后,配置档案修改到D盘abc资料夹下

③ 修改配置档案后,原来的配置不会复制到新档案中。如果需要,手动复制。

二、

“计算机管理”->本地使用者和组->abc双击->配置档案->“配置档案路径”和“本地路径”修改为d盘abc。

相对来说,第2种方法比较好一些。

苹果手机64位应用程式是什么意思

现在的苹果是64位系统

手机JAVATM应用程式是什么意思有什么用

JAVA软体是一种手机端的扩充套件应用程式!

android中应用程式是什么意思

android 是一个系统就跟你电脑用 windowsXP 或者 windows7 一样、 应用程式跟你电脑上用的 QQ啊 360安全卫士这样的就叫应用程式。也叫软体。 现在手机一般的应用程式也就UC QQ 输入法一类的

android应用程式,由一到多个Activity组成每个Activity没有很紧密的联络,因为我们可以在自己的程式中呼叫其它Activity,特别是呼叫自己的程式码之外生成的Activity,比如android提供的发简讯或者打电话的Activity

Intent call = new Intent(IntentACTION_CALL,Uriparse("tel:"+phonenumber);

startActivity(call);

Intent s = new Intent(IntentACTION_SENDTO,Uriparse(" sto:"+phonenumber);

startActivity( s);

从这点上看,android应用程式实际上是由多个Activity按照一定的次序拼装起来的,只不过拼装的过程中,后台传递了一些资料,使得各个Activity之间能比较好的衔接起来

intentsetType(“image/”);

//intentsetType(“audio/”); //选择音频

//intentsetType(“video/”); //选择视频 (mp4 3gp 是android支持的视频格式)

//intentsetType(“video/;image/”);//同时选择视频和

三星更新安卓系统,如何适配问题;

使用系统自带的Api(DownloadManager)

请求服务器接口然后配置一些相关的参数(网上百度有很多关于这个Api的介绍)

设置File路径(这里坑坑的 基本上主要的问题都在这)

判断版本>=70必须自定义FileProvider(网上解释好像说70为了什么什么安全 具体没有了解)

<70正常使用Intent安装即可(这里的坑就是三星note系列 其他的比如vivo,魅族,华为,非三星note系 列,小米。。没有遇到此类问题)

源码中被用来检查和请求权限的方法分别是Activity的checkSelfPermission和requestPermissions。这些方法api23引入,如下代码:

private static final String TAG = "Contacts"; 

private void insertDummyContact() { 

    // Two operations are needed to insert a new contact 

    ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2); 

 

    // First, set up a new raw contact 

    ContentProviderOperationBuilder op = 

            ContentProviderOperationnewInsert(ContactsContractRawContactsCONTENT_URI) 

                    withValue(ContactsContractRawContactsACCOUNT_TYPE, null) 

                    withValue(ContactsContractRawContactsACCOUNT_NAME, null); 

    operationsadd(opbuild()); 

 

    // Next, set the name for the contact 

    op = ContentProviderOperationnewInsert(ContactsContractDataCONTENT_URI) 

            withValueBackReference(ContactsContractDataRAW_CONTACT_ID, 0) 

            withValue(ContactsContractDataMIMETYPE, 

                    ContactsContractCommonDataKindsStructuredNameCONTENT_ITEM_TYPE) 

            withValue(ContactsContractCommonDataKindsStructuredNameDISPLAY_NAME, 

                    "__DUMMY CONTACT from runtime permissions sample"); 

    operationsadd(opbuild()); 

 

    // Apply the operations 

    ContentResolver resolver = getContentResolver(); 

    try { 

        resolverapplyBatch(ContactsContractAUTHORITY, operations); 

    } catch (RemoteException e) { 

        Logd(TAG, "Could not add a new contact: " + egetMessage()); 

    } catch (OperationApplicationException e) { 

        Logd(TAG, "Could not add a new contact: " + egetMessage()); 

    } 

}

Android框架包含了对各种Camera以及其上可用的Camera功能的支持,它允许你在应用程序中抓拍照片和视频。

注意事项

在开启应用程序使用Android设备上的Camera功能之前,要考虑一些打算如何使用这些硬件功能的问题:

1 Camera需求:要考虑应用程序是否必须要运行在有Camera的设备上,如果必须,就要在应用程序的清单中声明Camera需求;

2 快照或定制Camera:应用程序准备如何使用Camera?是只对抓拍或视频剪辑感兴趣?还是要应用程序提供使用Camera的新方法?对于抓拍或剪辑,要考虑使用既存的Camera应用程序。对于开发定制化的Camera功能,请看下文的“构建Camera应用程序”

基础

Android框架通过Camera API或Camera Intent来支持拍照和录像,以下是相关的类:

Camera

这个类是控制设备Camera的主API。在构建一个Camera应用程序时,它被用于拍照或录像。

SurfaceView

这个类用于向用户实时的展现Camera的预览。

MediaRecorder

这个类用于记录来自Camera的视频

Intent

MediaStoreACTION_IMAGE_CAPTURE或MediaStoreACTION_VIDEO_CAPTURE类型的Intent动作被用于不直接使用Camera对象来拍照或录像。

清单声明

在开始使用Camera API开发应用程序之前,要确保清单文件已经有了适当的声明,以允许使用Camera硬件和其他相关的功能。

1 Camera权限:应用程序必须申请使用设备Camera的权限。

<uses-permissionandroid:name="androidpermissionCAMERA"/>

注意:如果通过Intent来使用Camera,应用程序就不需要申请这个权限。

2 Camera功能:应用程序还必须要声明打算使用的Camera功能,例如:

<uses-featureandroid:name="androidhardwarecamera"/>

把Camera功能添加到应用程序的清单中,会让Google Play防止把程序安装到不包含Camera或不支持你所需要的Camera功能的设备上。关于如何使用基于功能过滤的Google Play,请看Google Play和基于功能的过滤

如果应用程序能够使用Camera或正确的操作Camera功能,但却不需要它,那么就应该在清单中指定android:required属性,并把属性值设置为false:

<uses-feature android:name="androidhardwarecamera" android:required="false" />

3 存储权限:如果应用程序要把或视频保存到设备的外部存储器上(如SD卡),就必须在清单中指定这个权限:

<uses-permissionandroid:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>

4 音频录音权限:对于视频采集的音频录音,应用程序必须要申请音频采集权限:

<uses-permissionandroid:name="androidpermissionRECORD_AUDIO"/>

5 位置定位权限:如果应用程序要给标记GPS位置信息,就必须申请位置定位权限:

<uses-permissionandroid:name="androidpermissionACCESS_FINE_LOCATION"/>

关于获得用户位置的更多信息,请看“定位策略”

使用既存的Camera应用

在应用程序中不需要太多的额外代码就可以快速的开启拍照或录像的方法是:使用Intent来调用一个既存的Android Camera应用程序。一个Camera Intent能够通过既存的Camera应用程序和它返回给应用程序的播放控制来申请采集一张照片或一段视频。本节会向你展示如何使用这项技术来采集一张或一段视频。

调用Camera Intent的过程会遵循以下这些大概的步骤:

1 编写一个Camera Intent:创建一个申请或视频的Intent对象,使用以下Intent类型之一:

MediaStoreACTION_IMAGE_CAPTURE:从一个既存的Camera应用中申请功能的Intent动作类型;

MediaStoreACTION_VIDEO_CAPTURE:从一个既存的Camera应用中申请视频功能的Intent动作类型。

2 启动Camera的Intent:使用startActivityForResult()方法来执行Camera的Intent。Intent启动后,该Camera应用程序的用户界面会显示在屏幕上,并且用户能够拍照或录像;

3 接收Intent的结果:在你的应用程序中建立一个onActivityResult()方法来接收来自Camera Intent的回调和数据。当用户完成成拍照或录像(或者是取消操作),系统会调用这个方法。

图像采集Intent

使用Camera Intent来采集图像是你的应用程序用最少的代码来拍照的快捷方式。一个采集Intent能够包含以下额外的信息:

MediaStoreEXTRA_OUTPUT:这个设置需要一个指定了保存路径和文件名的Uri对象。这个设置是可选,但强烈推荐使用。如果不指定这个值,Camera应用程序会用默认的名称把采集到的保存到默认的位置,这些默认值在IntentgetData()方法的返回字段中指定。

以下示例演示了如何构建一个采集Intent,并执行它。示例中GetOutputMediaFileUri()方法引用了下面“保存媒体文件”一节中的示例代码:

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;

private Uri fileUri;

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

// create Intent to take a picture and return control to the calling application

Intent intent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image

intentputExtra(MediaStoreEXTRA_OUTPUT, fileUri); // set the image file name

// start the image capture Intent

startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

}

startActivityResult()方法执行完成后,用户就会看到Camera应用程序的界面。用户完成拍照(或取消操作)之后,用户界面就会返回到你的应用程序中,并且你必须监听onActivityResult()方法来接收Intent的结果,并继续你的应用程序的执行。

视频采集Intent

使用Camera Intent采集视频是让你的应用程序能够用最少的代码来录像的一中快捷方式。视频采集Intent能够包含以下额外信息:

MediaStoreEXTRA_OUTPUT:这个设置要求用一个URI来指定保存视频的路径和文件名。虽然它是可选的,但强烈推荐使用这个设置。如果没有指定这个设置,那么Camera应用程序会把采集到的视频用默认的名称保存到默认的位置,默认的设置是在Intent的IntentgetData()方法域中返回的。

MediaStoreEXTRA_VIDEO_QUALITY:这个值的范围是0~1,0的时候质量最差且文件最小,1的时候质量最高且文件最大。

MediaStoreEXTRA_DURATION_LIMIT:这个值以秒为单位,显示视频采集的时长。

MediaStoreEXTRA_SIZE_LIMIT:这个值以字节为单位,限制视频采集的文件大小。

下面的示例演示了如何构造一个视频采集的Intent,并执行它。这个例子中的getOutputMediaFileUri()方法引用了下文的“保存媒体文件”中的示例代码:

private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

private Uri fileUri;

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

//create new Intent

Intent intent = new Intent(MediaStoreACTION_VIDEO_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video

intentputExtra(MediaStoreEXTRA_OUTPUT, fileUri); // set the image file name

intentputExtra(MediaStoreEXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

// start the Video Capture Intent

startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);

}

当startActivityForResult()方法被执行时,用户就会看到一个可编辑的Camera应用程序界面。在用户完成录像(或取消操作)之后,该用户界面就会返回到你的应用程序中,并且你必须监听onActivityResult()方法来接收Intent的结果,并继续执行你的应用程序。

接收Camera Intent结果

一旦你构建并执行了一个或视频的Camera Intent,那么就必须要配置你应用程序来接收Intent的结果。本节向你展示了如何监听来自Camera Intent的回调,以便应用程序能够对采集到的或视频做进一步的处理。

为了接收Intent的结果,必须在启动Intent的那个Activity中重写onActivityResult()方法。下面的示例演示了如何重写onActivityResult()方法来采集Camera Intent或视频Camera Intent的返回结果:

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;

private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

if (resultCode == RESULT_OK) {

// Image captured and saved to fileUri specified in the Intent

ToastmakeText(this, "Image saved to:\n" +

datagetData(), ToastLENGTH_LONG)show();

} else if (resultCode == RESULT_CANCELED) {

// User cancelled the image capture

} else {

// Image capture failed, advise user

}

}

if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {

if (resultCode == RESULT_OK) {

// Video captured and saved to fileUri specified in the Intent

ToastmakeText(this, "Video saved to:\n" +

datagetData(), ToastLENGTH_LONG)show();

} else if (resultCode == RESULT_CANCELED) {

// User cancelled the video capture

} else {

// Video capture failed, advise user

}

}

}

一旦Activity接收到一个成功的结果,那么你的应用程序就可以访问指定位置中的被采集的或视频。

你好,s3是可以用百度一键root的,不过值得注意的是root后不要随便删除系统程序,比如,你不喜欢手机自带的桌面想删除,这时要先下载一个桌面比如360桌面,并安装到手机内存中,安装后再可以删掉,否则删掉后手机会是黑屏, 手机中的归属地是不能删的,好多网友犯这个错误,认为有的软件已经带有归属地不用要手机自带的,删了之后会打不了电话,系统的东西最好不要动, 一些不懂的系统程序最好不要删,可以删一些第三方软件例如微博,搜狐新闻等用不上的软件。

  三星Galaxy S4 I9500多窗口完美全开的修改教程,通过这个三星S4多窗口全开修改教程修改系统文件之后,可以在Galaxy S4的flashbar/多窗口中使用所有安装在应用抽屉的应用程序,新安装的应用程序也可以使用,因此不需要在flashbar中添加新应用程序。

 准备事项

 1 准备好工具apktool,确定你对apktool的反编译和重新编译有所了解,而且知道怎么使用。

 2 准备好文本编辑器notepad++ 。

 3 准备好工具backsmali 。

 详细修改步骤

 1、修改flashbarserviceapk

 用apktool反编译system/app目录中的flashbarserviceapk

 进入flashbarservicesmalicomsecandroidappFlashBar Service

 用文件编辑器notepad++打开FlashBarInfosmali文件

 搜索方法 method public generateFlashBarList()V

 然后按照下面的说明来修改,左侧有-号的是你要删除的内容,有+号的`是你要增加的内容

 iget-object v10, v6, Landroid/content/pm/ResolveInfo;->filter:Landroid/content/IntentFilter;

 - const-string v11, "androidintentcategoryMULTIWINDOW_LAUNCHER"

 + const-string v11, "androidintentcategoryLAUNCHER"

 invoke-virtual {v10, v11}, Landroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z

 iget-object v10, v6, Landroid/content/pm/ResolveInfo;->filter:Landroid/content/IntentFilter;

 - const-string v11, "comsecandroidintentcategoryMULTIWINDOW_LAUNCHER"

 + const-string v11, "comsecandroidintentcategoryLAUNCHER"

 invoke-virtual {v10, v11}, Landroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z

 :try_end_0

 iget-object v8, v7, Landroid/content/pm/ResolveInfo;->filter:Landroid/content/IntentFilter;

 - const-string v9, "androidintentcategoryMULTIWINDOW_LAUNCHER"

 + const-string v9, "androidintentcategoryLAUNCHER"

 invoke-virtual {v8, v9}, Landroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z

 iget-object v8, v7, Landroid/content/pm/ResolveInfo;->filter:Landroid/content/IntentFilter;

 - const-string v9, "comsecandroidintentcategoryMULTIWINDOW_LAUNCHER"

 + const-string v9, "comsecandroidintentcategoryLAUNCHER"

 invoke-virtual {v8, v9}, Landroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z

 :try_end_0

 修改完成后,保存文件,然后重新编译回去,替换原文件,这一部分的修改就完成了。

 2、修改servicesjar

 反编译system/framework目录中的servicesjar文件

 进入servicesjaroutsmalicomandroidserveram目录

 使用文本编辑器notepad++打开MultiWindowManagerServicesmali文件

 搜索方法 method public isSupportApp(Ljava/lang/StringZ

 然后按照下面的说明来修改,左侧有-号的是你要删除的内容,有+号的是你要增加的内容

 prologue

 line 567

 + const/4 v0, 0x1

 +

 + goto :goto_0

 +

 iget-object v0, p0, Lcom/android/server/am/MultiWindowManagerService;->mSupportAppList:Ljava/util/ArrayList;

 invoke-virtual {v0, p1}, Ljava/util/ArrayList;->contains(Ljava/lang/Object;)Z

 修改完成后,保存文件,然后重新编译回去,替换原文件,这样就修改完了。

 上述修改完成并替换好文件后,你会发现多窗口列表中已经列出了所有应用程序,这样三星S4多窗口功能就可以随心所欲的使用了。以上就是三星S4多窗口完美全开的修改教程,本教程仅供各位参考。

蓝牙耳机的使用说明书中都会有相关的详细使用说明,这里拣重点说明一下。除了电源开关,耳机上一般有三个键。如下所示:

它们每个都是多功能键,在不同的情况下有不同的功能。1号键的功能包括:开始播放音乐/停止插入音乐/接听电话/挂断电话;2号键的功能有:增加音量/上一曲;3号键的功能有 减小音量/下一曲。

注:暂不包括通话模式;其它型号蓝牙耳机并不一定完全相同。

2蓝牙耳机上的按键实现原理

试用后会明白,一个按键会有多个功能,那么在Android系统中是如何表示的呢?其实对于Android系统,每次按键只会有一个唯一「键值」响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。

AVRCP全称(Audio/Video Remote Control Profile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送「键值」。

基于按键从Linux到Android分析具体对于的键值:

Linux扫描码 功能 映射字串 Android键值

00c8 200 开始放音乐 MEDIA_PLAY KEYCODE_MEDIA_PLAY

00c9 201 停止放音乐 MEDIA_PAUSE KEYCODE_MEDIA_PAUSE

00a3 163 下一曲 MEDIA_NEXT KEYCODE_MEDIA_NEXT

00a5 165 上-曲 MEDIA_PREVIOUS KEYCODE_MEDIA_PREVIOUS

Android应用代码,完整测试应用:TeskKey。

总结:1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3号键会在播放音乐时分别发送KEYCODE_MEDIA_PREVIOUS/KEYCODE_MEDIA_NEXT。如果想要把蓝牙耳机上的按键利用起来,可以在接收到KEYCODE_MEDIA_PLAY时播放 无声音乐 以使能2/3号键。这样就能完整接收3种键值了自行控制了。这个具体自行设计(测试代码已经更新包含了)。

注:这种实现并不一定通用,比如我在深度定制的MIUI中测试,尽管启动的TestKey应用,系统自带的音乐播放器仍然能同时响应键值。

更新:

已经更新TestKey源码,添加对蓝牙耳机按键的监听,实现方法就是上述中推测的方法,已经成功验证过了。播放音乐参考《Android多媒体开发--资源文件播放》。效果图:

需要说明一点的是,程序带了两个音乐文件在/res/raw中,默认播放的是lapplemp3一个有声音的mp3音乐文件,silence10secmp3是一个无声音的10秒钟音乐文件,实际应用中可以使用它。

问与答

1这个只能在播放音乐的状态下才能监听到么?

答:根据上述的原理,这些按键也仅仅是应用在控制媒体时使用;且根据实际验证没有播放音乐时蓝牙耳机的2/3号键是并没有向Android设备发送键值(从底层Linux来看)。综上所述,需要通过播放音乐来实现激活其向Android设备发送键值,针对这种情况可以播放一个「没有声音」的音乐文件来实现,这样既可以监听到2/3号键又可以不影响其它声音的输出。可以在前台时播放音乐,后台停止播放。

2我现在主要是想监听得到开关键(1号键)。 在做一个按下蓝牙开关键后启动一个语音识别的功能?

答:在我的测试条件下,1号键是可以正常监听到的。1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE键值。这个键不需要模拟播放音乐就可以正常的监听到。

3 4号按键的监听方法

答:所谓的4号按键,也就是指本文中的所测试型号的蓝牙耳机上并没有,但有可能其它型号的蓝牙耳机上有。我没有办法测试验证,所以这里就简单叙述一下「新按键」的键值确定思路:1先使用TestKey测试应用测试按键,测试Android上层是否可以得到对应键值。2如果没有得到,那么就使用adb shell getevent来看Linux底层可以不可以得到键值。然后根据按键从Linux到Android来确定Android上层使用的键值码到底是多少。(当然,如果你实在不知道如何监听,把蓝牙耳机寄给我,我给你确定也行。:))

注:其实上述文章完全是根据按键从Linux到Android测试确定下来的。那是篇文章是剥开Android外壳来看「按键」事件的流程的,方法适用于所有输入事件:各种按键/触摸/物理键盘/鼠标等待输入设备。没有一定的Linux开发经验很难看懂和理解。

4 Android后台监听按键怎么实现

或:如何启动一次应用后在后台一直监听播放键 因为有这样一个场景 在用户开车的时候需按一下开关键就启动语音识别的功能。

这个问题其实已经超出了本文讨论的范围,是Android系统对应用层的键盘事件(按键)的分发的问题了。正常情况下,按键只会向当前最端的应用分发键盘事件,也就是说在后台你边音量键都监听不了。

但是既然这种情况(后台应用监听按键)的需求存在,那么就一定有它存在的道理。比如「相机键」,按下后直接调出相机到最前台。从表面上看是相机响应了按键,但是从实现方法上来看,并不是通过键值来操作,必须通过其它方法,比如广播或者其它等等。

明白了其中的道理后,那么想要实现就好办了。先看这个按键有没有广播,如要有接听系统中发出来的广播;如果没有那么对于定制系统可以自己在系统中添加一个广播;总之,正常渠道是没有办法在后台监听一些不应该是你监听到的按键的。

更:查了一下,这个按键是有广播的。这样就可以后台响应了(不需要C/不需要root)。例子我就不试了,见Android官方例子RandomMusicPlayer。

其中的重点是这个广播androidintentactionMEDIA_BUTTON。

20141029更:

本来不想再更新那个Testkey了,好吧,我还是更新了一下,关于后台监听媒体相关按键的方法。没有在界面上更新,通过LogCat查看打印信息。

上述内容算「鱼」,下边把「渔」也提供了:

第一步先直接编译运行RandomMusicPlayer,然后发现确实不能收到广播,然后判断是系统版本问题,有可能是RandomMusicPlayer并没有更新为适合40以上的。在Capture media button on Android >=40 (works on 23)这里找到了问题所在,添加之成功。然后整合到Testkey上,具体改了哪些内容通过Github上的commit id查看。

20150108更:

关于测试程序的源码,是托管在Github上的,文中找到"TestKey"链接,打开后如下图下载:

APK下载

更新源码,添加编译好的APK文件。

直接下载地址:https://githubcom/kangear/TestKey/raw/master/apk/TestKeyapk

20150109更:

已经root的Android设备获取键值方法

如果设备已经root过了,那么可以更底层地获取键值。

1下载终端模拟器http://shoujibaiducom/soft/itemdocid=7309820

2运行su -c getevent 然后按下需要测试的按键 注:su -c getevent中间有空格

3会有如下输出,其中每次按下后输出数据的倒数第二行 倒数第二个是该按键的原始键值

4将此键值告知我,我来判断如何实现相应功能

注:

1该命令会监听所有输入事件 触摸屏/按键/蓝牙耳机/鼠标键盘 都会检测到,所以输出命令后不要再点击触摸屏 不然会有大量输出

2一般情况下每次按键会输出4行信息

3下图最后输出4行是按下 Vol- 的输出如果你的测试没有达到这个效果,要自行去对比哪里出现了问题

4以下监听蓝牙按键的实例

20150112更:

哪些键值会是蓝牙传递过来的

1 连接蓝牙后,如果直接按下蓝牙耳机上的某个键,你的手机会自动播放音乐,那么说明是该键值是从蓝牙耳机传递过来的

2 播放音乐后,如果可以仅仅通过蓝牙耳机上的某个键,你的手机会切换音乐,那么说明是该键值是从蓝牙耳机传递过来的

3 播放音乐时,如果可以仅仅通过蓝牙耳机上的某个键,你的手机屏幕上显示增大或者减小音量,那么说明该键值是从蓝牙耳机传递过来的反之如果只是蓝牙耳机内部音量进行了改变,Android没有任何的反应,那么说明该按键仅仅有控制蓝牙耳机音量的功能,并没有向Android上报键值

4 连接蓝牙通话,如果通过按下某个键,可以挂断电话,那么说明该按键是从蓝牙耳机传递过来的

案例:

a某个40版本协议的蓝牙耳机更注重省电,在控制音量时只是自身喇叭音量增大或者减小,并不是向Android系统报告需要增大或者减小音量的,那么说明这个按键根本从来就没有向Android报告过键值(无按键上传)

b某些型号的蓝牙耳机,本身不控制音量,当按下按下音量键时,会将键值传递给Android设备,要求Android进行增大或者减小音频源的音量 来实现音量的控制(有按键上传)

以上两种情况,虽然用户体验是并无太大差别,但是实现原理极为不同的

补充知识:

播放音量/音频通话是蓝牙耳机中两个不同的规范,一般情况下都会同时支持,但是有时候会仅仅支持后者(也称 单声道蓝牙耳机),为的是更省电当然也会进一步压缩一些功能

20150113更 单通道耳机不能使用上述方法检测按键分析

蓝牙标准规范列表:https://enwikipediaorg/wiki/List_of_Bluetooth_profiles

这里说明几个常用的规范:(规范也可以理解为通道)

1_正常_播放音乐

2_正常_播放音乐时按键

3语音通话/以及语音通话时按键

注:对于单声道耳机(默认只能接听电话)通过某些软件实现的播放音乐的原理是将「音乐的信号」通过「语音通话通道」传输给耳机的。耳机实质还是工作在「语音通话」模式下。

说一千道一万,对于第三种情况下的非按键的按键如何检测,且听下回分解。;)

这里简单推测一下原理,第3种情况下"按键"是被包括在通话语音信号中的,应该是直接被Phone应用解析并进行了相应操作。Android42以上的版本中会有一个内置的无界面的应用程序名字叫Bluetoothapk,它是Android系统对中蓝牙设备支持的核心,所有的规范(profile)都是通过它来解析的。所以要研究一下它和Phone应用之间做了什么见不得人的勾当才能知道如何。 ;)

当然简单一点,也可以通过监听音量变化也实现曲线监听等等,不过这个不是我研究的重点。

另外一点是 对于单声道耳机按键研究 目前也只能是挖的一个坑。什么时候埋暂时不好说。

先写到这里 (语音通话时“按键”处理过程)

文字描述:已经找到处理过程,和推测的一致。Bluetooth解析出特定的“按键”后直接进行处理,没有向外界通知什么。根据高亮的英文也能猜测出含意。第一张图是语音通话时的各种“按键”事件,第二张图是对“拨号/重拨”键的处理。高亮出是重拨时获取通话记录中最后一个号码。如果可以访问Google那么你也可以直接在线查看我截图的这两段代码片段。HeadsetStateMachinejava(另:我是基于422分析的),这是简单的分析过程,对于如何在APP中监听,