`
huangqinqin
  • 浏览: 359542 次
  • 性别: 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();
}
}
}
分享到:
评论

相关推荐

    TidyTuesday_Weekly_Data_Viz_Challenge:R-Tidyverse

    TidyTuesday是哪些地方在总结和整理数据做出有意义的使用图表强调每周数据挑战ggplot2 , tidyr , dplyr和其他工具在tidyverse生态系统。 下面提供了可视化列表: 2020年12月1日第49周 :house: 多伦多庇护所 2020...

    嵌入式智能车载终端的设计与实现

    基于QT的可视倒车功能和车载语音电话功能的软件开发。 经过反复调试和改进系统实现了预期的功能。最后,文章对系统进行了总结和展望,提出了系统升级的方案。本系统经济实用,可广泛应用于家用车辆。

    OA办公自动化管理系统

    具体功能包括我的便签、工作日记、日程安排、计划总结、我的任务、个人信息维护、工作委托安排、网络硬盘、我的短语、通讯录等。 行政办公行政办公模块帮助对企业的各种资源进行有效地管理,检测使用冲突,合理调控...

    招聘数据分析.docx

    由此可见,招聘过程数据化、招聘成果可视化是何等重要! 对于核心岗位的招聘更是如此。关键人才招聘难已成为普遍现象,招贤纳士不再只是HR的一己之任也成为共识,用人部门在招聘过程中的配合度极大影响着招聘结果,...

    《大数据》读书心得.docx

    回顾历史,我们从广播的年代到电视的年代再到本世纪初互联网的年代,从音频对话到可视电话,数据技术一直在我们的生活中扮演重要的角色,互联网出现之后,就交流和互动而言,广播和电视无疑相形见绌。 "大数据"可能...

    数据结构课设

    3. 课程设计报告中的算法说明,课程设计报告中总结(20%) 4. 独立完成情况( 40%) 加分项目: 1.工作量和选题难度 2.可读性:代码编写是否规范,是否便于阅读。如函数、变量命名,‘{ }’的缩进,关键位置适量注释...

    实验1答案 - 建立学生数据库.sql

    建立环境实验和数据库/表 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的 ...将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、分析总结,提出实验结论或自己的看法。

    2019数据运营思维导图

    怎么做 数据收集 数据太多可以采用抽样的方法 数据建模 根据所获取到的数据建立模型,注入数据调整模型参数 数据分析及预测 数据可视化、输出报表、趋势预测 留存分析 留存(次~7日、14日、30日) 解决问题 用户对...

    数据运营思维导图

    数据可视化、输出报表、趋势预测 留存分析 留存(次~7日、14日、30日) 解决问题 用户对游戏的适应性 用户对于游戏的粘性 评估渠道用户的质量、投放渠道效果评估 新增用户什么时候流失在加剧? 注意事项 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Viewport不局限于浏览器可视区域的大小,可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。 媒体查询 CSS媒体查询允许开发者基于浏览网站的设备的特性来应用不同的样式申明,最常用的特性是视口宽度。 ...

Global site tag (gtag.js) - Google Analytics