`
huangqinqin
  • 浏览: 365842 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

可视电话总结

 
阅读更多
1:将带有分隔符的多个字符串追加在一起
HashMap mMap = new HashMap();
public String flatten(){
StringBuilder flattened = new StringBuilder();
for (String k:mMap.keySet()){
flattened.append(k);
flattened.append("=");
flattened.append(mMap.get(k));
flattened.append(";");
}
flattened.deleteCharAt(flattened.length() - 1);
return flattened.toString();
}

2:将带有分隔符的字符串分解,存入已经定义的mMap中
public void unflattend(String flattened){
HashMap mMap = new HashMap();
mMap.clear();
if (null != flattened || !("".equals(flattened)){
StringTokenizer tokenizer = new StringTokenizer(flattened, ";");
while (tokenizer.hasMoreElements()){
String kv = tokenizer.nextToken();
int pos = kv.indexOf('=');
if (pos == -1){
continue;
}
String k = kv.subString(0, pos);
String v = kv.subString(pos+1);
mMap.put(k, v);

}
}else{
return;
}
}

3:设置屏幕亮度
try{
IPowerManager power
= IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
power.setBacklightBrightness(150);
}catch(Exception e){}


4:可视电话流程
4.1 第一次启动Phone:
onCreate() —— beginPlayerVideo( ) —— prepareJNI( ) —— 重置Camera的值, 刷新界面

4.2 从后台切到前台,或挂断电话后重新启动Phone(挂断电话后, Phone切换到后台, 并没有真正finish掉,所以再次启动Phone时直接走onResume方法):
将Phone切换到后台。
public void finish(){
        if (DBG) log("finish()...");
        moveTaskToBack(true);
    }
onResume()—— restartJNI()——prepareJNI()——重置Camera的值,刷新界面

4.3 Activity的生命周期
onCreate()——onStart()——onResume()——onPause()——onStop()—— onDestory()
4.4 通过当前被选中的Camera(如mCameraSelect)在方法prepareJNI()中调用createHandle()方法,返回mVTHandle(引擎句柄)。

5:ScrollView中只可以拥有一个直接的Child View, 但它的Child View中可以嵌套多个Child(简言之,ScrollView只可以拥有一个儿子,但可以拥有很多孙子)

6:设置终端语言,放置终端显示乱码
export LANG=en

7:在源码根目录下编译应用源码
make clean-Contacts
make Contacts -j 50

8:打印AT命令的log
adb logcat -b radio -s AT

9:烧写boot.img 和 system.img
9.1 进入tools目录(可以使用adb命令)
9.2 烧boot.img
fastboot -i 0x12d1 flash boot boot.img
9.3 烧system.img
fastboot -i 0x12d1 flash system system.img
9.4 擦除数据
fastboot -i 0x12d1 erase userdata

10:解压缩
10.1 打包 tar czvf sdk.tar.gz sdk
10.2 解包 tar xvf sdk.tar

11:防止空指针
String path;
if ((" ".equals(path)) || (null == path))

12:静态变量和静态常量的命名
private static int var = 0;
private static final int VAR = 0;

13:避免使用魔鬼数字

14:命名要规范

15:一定要加注释(方法,变量,重要的步骤)

16:先理清逻辑思路再编程

17:尽量做到一个方法只做一件事

18:xml中TextView的单行字太多,使用滚动的方法:
android:single="true"
android:marqueeRepeatLimit="marquee_forever"
android:ellipsize="marquee"

19:自定义LinearLayout中利用inflate
LinearLayout  l = (LinearLayout) view.inflate(mContext, R.layout.layout, null);

20:切换两个View的位置
分别取left,right,top,bottom
再让两个View切换left,right,top, bottom
如:view.layout(left, right, top, bottom);

21:查看具体累的相关log: adb logcat -s 类名

22:能不用全局变量就不用全局变量。






23:音量调节
IWindowManager mWm;
mWm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
if (null == mWm){
return;
}

KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_DOWN);
try{
mWm.injectKeyEvent(KeyEvent.false);
}catch(Exception e){
}

24:可视电话中private模式
第一次启动Phone,private模式为关闭,即正常显示视频数据
当单击按钮,启动private模式后,如果在setting中获取的usePrivateImage为0(表示不使用替代图像)则本端Camera显示黑屏,如果usePrivateImage为1(表示使用替代图像)则本端显示从setting中获取的path相关的图片,如果path为空,则显示默认的替代图像。大概流程如下:
if (!isPrivate){
if (usePrivateImage){
if (null.equals(path)){
path = "/work/default";
}
mMediaControl.usePrivate(mVTHandle,true,path);
}else{
stopCallPreview();
}
}else{
if(usePrivateImage){
mMediaControl.usePrivate(mVTHandle, false, path);
}else{
startCallPreview();
}
}








25:ScrollView滚动事件处理
ScrollView分两种:竖屏滚动条(ScrollView),横屏滚动条(HorizontalScrollView)
Android中自带这两个控件。
在VT这个项目中Camera设置和其他菜单用到这两个控件。

Camera Setting中(四个主选项并列排成一行,宽度刚好):
亮度:高,中,低
白平衡:自动,日光,阴天,荧光,白炽光(需要ScrollView作为容器)
对比度:2,1,0,-1,-2(需要ScrollView作为容器)
缩放:1px,2px

Other Menu中(五个主选项排成一行,但界面可见的只有四个,所以需要HorizontalScrollView作为容器实现滚动效果):
语音呼叫
屏幕亮度:200,150,100,50,10(需要ScrollView作为容器)
录像设置:录制远端视频,录制语音,录制语音和视频
录音
远端静音

以上选项需要支持轨迹球(Trackball)操作,但因为在触发轨迹球后系统会优先将轨迹球的焦点落在ScrollView,HorizontalScrollView上,包含在里面的子控件随后获得轨迹球焦点。但客户的要求是优先考虑子控件的轨迹球焦点,ScrollView和HorizontalScrollView随着子控件焦点的移动而发生滚动操作。
通过调用:
HorizontalScrollView  s = null ;
s.setFocusable(false);来禁止 s获取焦点,再通过相关操作将焦点分给子控件。

当然在禁止HorizontalScrollView获取焦点后,希望它还能随着子控件滚动的话
可以通过s.fullScroll(HorizontalScrollView.FOCUS_DOWN)来控制该ScrollView向下滚动,其他参数还有(HorizontalScrollView.FOCUS_UP,
HorizontalScrollView.FOCUS_LEFT,HorizontalScrollView.FOCUS_RIGHT)

fullScroll方法最好在onKeyDown中调用。
轨迹球的五个方向键值分别为:
KeyEvent.KEYCODE_DPAD_UP,KeyEvent.KEYCODE_DPAD_DOWN,

KeyEvent.KEYCODE_DPAD_LEFT,KeyEvent.KEYCODE_DPAD_RIGHT,

KeyEvent.KEYCODE_DPAD_CENTER。

参考代码如下:


public class CustomView extends Activity implements OnClickListener {

private CustomToggleButton mToggleButton1;
private CustomToggleButton mToggleButton2;
private CustomToggleButton mToggleButton3;
private CustomToggleButton mToggleButton4;
private CustomToggleButton mToggleButton5;
private CustomToggleButton mToggleButton6;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mToggleButton1 = (CustomToggleButton)findViewById(R.id.toggle_button_1);
        mToggleButton1.setText("Button1");
        mToggleButton1.setOnClickListener(this);
        mToggleButton2 = (CustomToggleButton)findViewById(R.id.toggle_button_2);
        mToggleButton2.setText("Button2");
        mToggleButton2.setOnClickListener(this);
        mToggleButton3 = (CustomToggleButton)findViewById(R.id.toggle_button_3);
        mToggleButton3.setText("Button3");
        mToggleButton3.setOnClickListener(this);
        mToggleButton4 = (CustomToggleButton)findViewById(R.id.toggle_button_4);
        mToggleButton4.setText("Button4");
        mToggleButton4.setOnClickListener(this);
        mToggleButton5 = (CustomToggleButton)findViewById(R.id.toggle_button_5);
        mToggleButton5.setText("Button5");
        mToggleButton5.setOnClickListener(this);
        mToggleButton6 = (CustomToggleButton)findViewById(R.id.toggle_button_6);  
        mToggleButton6.setText("Button6");
        mToggleButton6.setOnClickListener(this);
       
        addTrackballItems();
    }

@Override
public void onClick(View v) {
int resId = v.getId();
handleButtonEvent(resId);
}

private void handleButtonEvent(int resId){
switch (resId){
case R.id.toggle_button_1:
mToggleButton1.setChecked(true);
Intent intent = new Intent();
intent.setClass(this, TestBringToFront.class);
startActivity(intent);
break;
case R.id.toggle_button_2:
mToggleButton2.setChecked(true);
break;
case R.id.toggle_button_3:
mToggleButton3.setChecked(true);
break;
case R.id.toggle_button_4:
mToggleButton4.setChecked(true);
break;
case R.id.toggle_button_5:
mToggleButton5.setChecked(true);
break;
case R.id.toggle_button_6:
mToggleButton6.setChecked(true);
break;
}
}

private int convertIndexToResId(int curIndex){
if (curIndex == 0){
return R.id.toggle_button_1;
}else if (curIndex == 1){
return R.id.toggle_button_2;
}else if (curIndex == 2){
return R.id.toggle_button_3;
}else if (curIndex == 3){
return R.id.toggle_button_4;
}else if (curIndex == 4){
return R.id.toggle_button_5;
}else {
return R.id.toggle_button_6;
}
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
searchUpFocus();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
searchDownFocus();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
searchRightFocus();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
searchLeftFocus();
break;
case KeyEvent.KEYCODE_DPAD_CENTER:
handleButtonEvent(convertIndexToResId(mCurTrackballIndex));
break;
}
return super.onKeyDown(keyCode, event);
}

private ArrayList<View> mTrackballItems = new ArrayList<View>();
private int mCurTrackballIndex = 0;
private int mTrackballItemsCount = 0;
private void addTrackballItems(){
mTrackballItems.add(mToggleButton1); // index = 0
mTrackballItems.add(mToggleButton2); // index = 1
mTrackballItems.add(mToggleButton3); // index = 2
mTrackballItems.add(mToggleButton4); // index = 3
mTrackballItems.add(mToggleButton5); // index = 4
mTrackballItems.add(mToggleButton6); // index = 5
mTrackballItemsCount = mTrackballItems.size();
}

private void searchUpFocus(){
if (mTrackballItems.get(mCurTrackballIndex).isSelected()){
if (mCurTrackballIndex - 3 >= 0){
mTrackballItems.get(mCurTrackballIndex).setSelected(false);
mCurTrackballIndex = mCurTrackballIndex - 3;
}else {
return;
}
}else {
mCurTrackballIndex = 0;
}
mTrackballItems.get(mCurTrackballIndex).setSelected(true);
setCurFocus(mCurTrackballIndex);
}

private void searchDownFocus(){
if (mTrackballItems.get(mCurTrackballIndex).isSelected()){
if (mCurTrackballIndex - 3 < 0){
mTrackballItems.get(mCurTrackballIndex).setSelected(false);
mCurTrackballIndex = mCurTrackballIndex + 3;
}else {
return;
}
}else {
mCurTrackballIndex = 0;
}
mTrackballItems.get(mCurTrackballIndex).setSelected(true);
setCurFocus(mCurTrackballIndex);
}

private void searchRightFocus(){
boolean isVaildUpRow = (mCurTrackballIndex >= 0) && (mCurTrackballIndex < 3);
boolean isVaildDownRow = (mCurTrackballIndex >= 3) && (mCurTrackballIndex < 5);

if (mTrackballItems.get(mCurTrackballIndex).isSelected()){
if (isVaildUpRow || isVaildDownRow){
mTrackballItems.get(mCurTrackballIndex).setSelected(false);
mCurTrackballIndex = mCurTrackballIndex + 1;
}else {
return;
}
}else {
mCurTrackballIndex = 0;
}
mTrackballItems.get(mCurTrackballIndex).setSelected(true);
setCurFocus(mCurTrackballIndex);
}

private void searchLeftFocus(){
boolean isVaildUpRow = (mCurTrackballIndex > 0) && (mCurTrackballIndex <= 3);
boolean isVaildDownRow = (mCurTrackballIndex > 3) && (mCurTrackballIndex <= 5);

if (mTrackballItems.get(mCurTrackballIndex).isSelected()){
if (isVaildUpRow || isVaildDownRow){
mTrackballItems.get(mCurTrackballIndex).setSelected(false);
mCurTrackballIndex = mCurTrackballIndex - 1;
}else {
return;
}
}else {
mCurTrackballIndex = 0;
}
mTrackballItems.get(mCurTrackballIndex).setSelected(true);
setCurFocus(mCurTrackballIndex);
}

private void setCurFocus(int curIndex){
clearAllFocus();
((CustomToggleButton)mTrackballItems.get(curIndex)).setBgFocus();
}

private void clearAllFocus(){
for (int i = 0; i < mTrackballItemsCount; i++){
((CustomToggleButton)mTrackballItems.get(i)).clearBgFocus();
}
}
}
分享到:
评论

相关推荐

    可视电话测试报告--优秀毕业论文

    本文档是对《可视电话测试报告——优秀毕业论文》的详细解读与总结,该论文由谢金明同学在其指导老师廖永红和熊凤霞的帮助下完成,并被选为计算机工程系的优秀毕业论文。论文主要围绕广州泛网科技有限公司开发的...

    嵌入式可视电话平台设计

    ### 嵌入式可视电话平台设计的知识点详解 #### 一、嵌入式可视电话的概念及重要性 嵌入式可视电话是一种结合了通信技术、计算机技术、音视频处理技术等多种技术于一体的通信设备。它能够在传统的公共交换电话网络...

    基于WindowsCE的可视电话的研究与实现

    ### 基于Windows CE的可视电话研究与实现的关键知识点 #### 一、嵌入式操作系统概述 嵌入式操作系统是专门为嵌入式系统设计的操作系统软件,它为嵌入式系统的开发提供了基础支撑。这类操作系统通常具有体积小、...

    一流的可视电话控件avphone

    总结来说,一流的可视电话控件avphone是开发高质量视频通话应用的理想选择,它通过强大的功能集、优秀的性能和易于集成的特性,帮助开发者轻松构建安全、高效的实时通讯系统。无论是在个人通讯、教育、医疗还是企业...

    弱电施工组织设计-新型家庭可视电话终端施工方案

    总结,弱电施工组织设计-新型家庭可视电话终端施工方案是将现代科技融入日常生活的重要实践,通过细致的规划和严谨的施工,可以实现家庭通讯的智能化和便捷化,提升生活品质。在实施过程中,施工人员应具备扎实的...

    一种嵌入式可视IP电话终端的设计与实现.pdf

    早期的可视电话主要依赖于公共电话交换网(PSTN),但受限于较低的传输速率,难以支持高质量的视频通话需求。随着IP技术的进步,以及音视频编解码标准、网络实时传输协议和信令协议的出现和完善,基于IP的可视电话...

    一款ippbx用于可视化管理freeswitch

    总结,这款IPPBX方案结合了Freeswitch的强大功能,通过可视化界面提供了一种简单高效的管理方式,适用于构建和运营呼叫中心或呼叫系统。无论是对于初学者还是经验丰富的IT专业人士,都能显著提升工作效率并降低运维...

    sip安卓电话4款

    总结来说,这些SIP安卓电话应用都是为了利用SIP协议在移动设备上实现IP电话功能。它们提供了替代传统电话的通信方式,通过互联网连接实现全球范围内的通话,节省通话费用。用户可以根据自己的需求,比如音质、稳定性...

    sip软电话源代码

    总结来说, sip软电话源代码的分析不仅有助于理解其工作原理,也为开发者提供了定制和优化通信服务的可能性。通过学习和研究,我们可以更好地利用 sip软电话技术,为不同需求的用户提供高效、安全、便捷的通信解决...

    ensight可视化软件用户说明

    以上知识点总结了从文件内容中提取的信息,对Ensight可视化软件的用户手册内容做了一个详细的概述。对于使用Ensight软件的用户来说,了解这些知识将有助于更高效地使用软件,以及避免侵犯版权或违反授权协议。

    互联网 智慧楼宇IBMS可视化大数据方案

    总结来说,"互联网+智慧楼宇IBMS可视化大数据方案"是现代楼宇管理的创新模式,它通过整合各种智能技术,实现对楼宇的精细化管理,提高管理效率,降低运营成本,同时也为用户提供更加便捷、舒适的生活和工作环境。...

    数据可视化个人简历.pptx

    #### 总结 此份数据可视化个人简历不仅展示了求职者的个人信息、教育背景、工作经验和技术专长,还特别突出了其在软件开发和数据分析领域的实际成果。通过数据可视化的形式,求职者能够更直观地呈现自己的技能与...

    4G5G可视化智慧应急调度指挥系统技术方案.docx

    总结,4G/5G 可视化智慧应急调度指挥系统充分利用了现代通信技术和大数据的优势,构建了一个高效、智能、可视化的应急管理体系。它不仅可以提升应急响应速度,还可以通过数据分析优化决策,为公共安全和应急管理工作...

    可视化 智慧农业V1.0.pdf

    总结来说,“可视化智慧农业V1.0”方案通过集成现代信息技术,对农业生产环境进行精准监测、管理与控制,实现可视化、智能化的农业监控管理,提高了农作物的产量和质量,并为农业生产者提供了便捷的生产溯源和决策...

    基于GIS的电力智能高效可视化定位调度系统.docx

    【总结】基于GIS的电力智能高效可视化定位调度系统通过集成多种功能,实现了电力调度的现代化和智能化。它不仅能有效应对电力需求增长和配网复杂性的挑战,还提升了管理水平,确保了电网的安全稳定运行。这样的系统...

    基于GIS的电力智能高效可视化定位调度系统.pdf

    电力智能高效可视化定位调度系统由多个子系统组成,包括SCADA数据采集系统、视频监控系统、95598信息平台、电话调度系统、GIS地理信息应用和GPS车辆定位等。其中: 1. **SCADA数据采集系统接口**:负责变电站遥信、...

    面试心得体会(面试心得总结300字).pdf

    7. **可视电话面试**:随着技术的发展,可视电话面试变得越来越常见。面试者需要适应这种新的面试形式,保持良好的网络环境,确保背景整洁,仪态得体,如同面对面面试一样对待。 8. **决策与跟进**:面试结束后,...

    LC6311 模块视频电话的开发手册

    - **基于集成H324M的DTM6311模块的可视电话实现方案:** 介绍了另一种更为优化的方法,利用集成H.324M协议栈的DTM6311模块来实现视频电话功能。 **3. 业务流程** 这部分详细阐述了视频电话的各个阶段,包括但不...

    智能物业可视化综合管理平台解决方案.pptx

    总结来说,智能物业可视化综合管理平台是物业管理行业的革新,它通过科技手段解决了传统物业管理的痛点,实现了物业集团的高效、智能管理,提升了整体服务水平。随着技术的发展,这样的平台将会在未来的物业管理中...

Global site tag (gtag.js) - Google Analytics