android APK应用层到kernel层功能接口调用实现总结
一.问题现象及背景:
客户有个需求需要在上层apk中控制手机上的VMIC、SPK、RAY_LED、OTG、SWITCH、PTT_SWITCH、PTT_PD、BULE_LED、KEYPAD_LED等按键、音频、镭射、OTG、灯的功能切换。其中部分功能是该手机上新增的功能,android原生系统上没有提供相关的接口,因此需要在原生系统框架上增加相关接口,实现APK应用中控制手机上的这些功能。
主要参考原生系统上APK到kernel层接口的调用框架实现,下面以该功能主要代码实现来简述APK应用层到kernel层功能接口调用实现。
二.主要代码实现:
1. apk应用主要代码实现
a. 文件packages\K508Control\src\com\android\tmptest\Test.java
package com.android.tmptest;
import android.content.Intent;
importandroid.content.SharedPreferences;
import android.os.Bundle;
importandroid.preference.CheckBoxPreference;
importandroid.preference.EditTextPreference;
importandroid.preference.ListPreference;
importandroid.preference.Preference;
importandroid.preference.PreferenceActivity;
importandroid.preference.PreferenceManager;
importandroid.preference.PreferenceScreen;
importandroid.preference.Preference.OnPreferenceClickListener;
import android.util.Log;
//importcom.android.server.K508ControlService;
import android.os.IK508ControlService;
import android.os.ServiceManager;
public class Test extendsPreferenceActivity implements
Preference.OnPreferenceClickListener,
Preference.OnPreferenceChangeListener{
privatePreference mPreference_VMIC;
privatePreference mPreference_SPK;
privatePreference mPreference_RAY;
privatePreference mPreference_OTG;
privatePreference mPreference_SWITCH;
privatePreference mPreference_PTT_SWITC;
privatePreference mPreference_PTT_PD;
privatePreference mPreference_BULE;
privatePreference mPreference_KEYPAD;
privateIK508ControlService k508Service = null;
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("zhengconglong","onCreate");
addPreferencesFromResource(R.xml.tp_test);
mPreference_VMIC =(Preference)findPreference("K508_IOC_VMIC_EN");
mPreference_SPK =(Preference)findPreference("K508_IOC_SPK_EN");
mPreference_RAY =(Preference)findPreference("K508_IOC_RAY_LED_EN");
mPreference_OTG =(Preference)findPreference("K508_IOC_OTG_EN");
mPreference_SWITCH =(Preference)findPreference("K508_IOC_SWITCH_EN");
mPreference_PTT_SWITC =(Preference)findPreference("K508_IOC_PTT_SWITCH_EN");
mPreference_PTT_PD =(Preference)findPreference("K508_IOC_PTT_PD");
mPreference_BULE =(Preference)findPreference("K508_IOC_BULE_LED_EN");
mPreference_KEYPAD =(Preference)findPreference("K508_IOC_KEYPAD_LED_EN");
mPreference_VMIC.setOnPreferenceClickListener(this);
mPreference_SPK.setOnPreferenceClickListener(this);
mPreference_RAY.setOnPreferenceClickListener(this);
mPreference_OTG.setOnPreferenceClickListener(this);
mPreference_SWITCH.setOnPreferenceClickListener(this);
mPreference_PTT_SWITC.setOnPreferenceClickListener(this);
mPreference_PTT_PD.setOnPreferenceClickListener(this);
mPreference_BULE.setOnPreferenceClickListener(this);
mPreference_KEYPAD.setOnPreferenceClickListener(this);
SharedPreferencesshp = PreferenceManager.getDefaultSharedPreferences(this);
k508Service= IK508ControlService.Stub.asInterface(ServiceManager.getService("K508Control"));
}
@Override
protectedvoid onResume() {
super.onResume();
}
@Override
protectedvoid onPause() {
super.onPause();
}
publicboolean setSummary(Preference pf) {
if(pf.getSummary().equals("false")){
pf.setSummary("true");
return true;
}else{
pf.setSummary("false");
return false;
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
// Log.d("zhengconglong","onPreferenceClick");
if (preference == mPreference_VMIC) {
// Log.d("zhengconglong","111111");
if(setSummary(mPreference_VMIC)){
//mPreference_VMIC on
try {
k508Service.setVal(0,1);
}catch (Throwable e) {
Log.d("k508ServicemPreference_VMIC", "error");
}
Log.d("k508ServicemPreference_VMIC", "on");
} else {
//mPreference_VMIC off
try {
k508Service.setVal(0,0);
}catch (Throwable e) {
Log.d("k508ServicemPreference_VMIC", "error");
}
Log.d("k508ServicemPreference_VMIC", "off");
}
// Log.d("zhengconglong","K508_IOC_VMIC_EN");
}else if(preference.getKey().equals("K508_IOC_SPK_EN")) {
// Log.d("zhengconglong","22222");
if(setSummary(mPreference_SPK)){
try{
k508Service.setVal(1,1);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_SPK_EN", "error");
}
Log.d("k508ServicemPreference_SPK", "on");
} else {
try{
k508Service.setVal(1,0);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_SPK_EN", "error");
}
Log.d("k508Service mPreference_SPK","off");
}
}else if(preference.getKey().equals("K508_IOC_RAY_LED_EN")) {
if(setSummary(mPreference_RAY)){
try{
k508Service.setVal(2,1);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_RAY_LED_EN", "error");
}
Log.d("k508ServiceK508_IOC_RAY_LED_EN", "on");
} else {
try{
k508Service.setVal(2,0);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_RAY_LED_EN", "error");
}
Log.d("k508ServiceK508_IOC_RAY_LED_EN", "off");
}
}else if(preference.getKey().equals("K508_IOC_OTG_EN")) {
if(setSummary(mPreference_OTG)){
try{
k508Service.setVal(3,1);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_OTG_EN", "error");
}
Log.d("k508ServiceK508_IOC_OTG_EN", "on");
} else {
try{
k508Service.setVal(3,0);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_OTG_EN", "error");
}
Log.d("k508ServiceK508_IOC_OTG_EN", "off");
}
}else if(preference.getKey().equals("K508_IOC_SWITCH_EN")) {
if(setSummary(mPreference_SWITCH)){
try{
k508Service.setVal(4,1);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_SWITCH_EN", "error");
}
Log.d("k508ServiceK508_IOC_SWITCH_EN", "on");
} else {
try{
k508Service.setVal(4,0);
}catch (Throwable e) {
Log.d("k508ServiceK508_IOC_SWITCH_EN", "error");
}