当前位置:  编程技术>移动开发
本页文章导读:
    ▪手机通话统制        手机通话控制 看到网络上的牛人对手机通话的控制,有感而发,希望搞个能在手机接到电话时可以给对方播放一段音频。看了下源码,发现如果仅仅通过 ITelephony.aidl的一些API似乎没有这个功.........
    ▪ 错误分类        异常分类   android 异常分类   http://hi.baidu.com/hkdao/blog/item/521390c8583f198fc817686b.html   一、异常: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405d8c20 is not valid; is.........
    ▪ 施用onPause()和onSaveInstanceState保存数据       运用onPause()和onSaveInstanceState保存数据 public class TestPictureLayout extends Activity {      static final int DAY_VIEW_MODE = 0;      static final int WEEK_VIEW_MODE = 1;      private SharedPreferences mPrefs;      private.........

[1]手机通话统制
    来源: 互联网  发布时间: 2014-02-18
手机通话控制

看到网络上的牛人对手机通话的控制,有感而发,希望搞个能在手机接到电话时可以给对方播放一段音频。看了下源码,发现如果仅仅通过 ITelephony.aidl的一些API似乎没有这个功能,难道要把这块的代码给扣出来进行修改吗,就是RIL.java那块。系统似乎没有给出这方 面的功能API啊。
    RIL.java
public void
    acceptCall (Message result) {
        RILRequest rr
                = RILRequest.obtain(RIL_REQUEST_ANSWER, result);
        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
        send(rr);
    }

处理电话事件:
public void
        handleMessage(Message msg) {
            RILRequest rr = (RILRequest)(msg.obj);
            RILRequest req = null;
            switch (msg.what) {
                case EVENT_SEND:
                    /**
                     * mRequestMessagePending++ already happened for every
                     * EVENT_SEND, thus we must make sure
                     * mRequestMessagePending-- happens once and only once
                     */
                    boolean alreadySubtracted = false;
                    try {
                        LocalSocket s;
                        s = mSocket;
                        if (s == null) {
                            rr.onError(RADIO_NOT_AVAILABLE, null);
                            rr.release();
                            mRequestMessagesPending--;
                            alreadySubtracted = true;
                            return;
                        }
                        synchronized (mRequestsList) {
                            mRequestsList.add(rr);
                        }
                        mRequestMessagesPending--;
                        alreadySubtracted = true;
                        byte[] data;
                        data = rr.mp.marshall();
                        rr.mp.recycle();
                        rr.mp = null;
                        if (data.length > RIL_MAX_COMMAND_BYTES) {
                            throw new RuntimeException(
                                    "Parcel larger than max bytes allowed! "
                                                          + data.length);
                        }
                        // parcel length in big endian
                        dataLength[0] = dataLength[1] = 0;
                        dataLength[2] = (byte)((data.length >> 8) & 0xff);
                        dataLength[3] = (byte)((data.length) & 0xff);
                        //Log.v(LOG_TAG, "writing packet: " + data.length + " bytes");
                        s.getOutputStream().write(dataLength);
                        s.getOutputStream().write(data);
                    } catch (IOException ex) {
                        Log.e(LOG_TAG, "IOException", ex);
                        req = findAndRemoveRequestFromList(rr.mSerial);
                        // make sure this request has not already been handled,
                        // eg, if RILReceiver cleared the list.
                        if (req != null || !alreadySubtracted) {
                            rr.onError(RADIO_NOT_AVAILABLE, null);
                            rr.release();
                        }
                    } catch (RuntimeException exc) {
                        Log.e(LOG_TAG, "Uncaught exception ", exc);
                        req = findAndRemoveRequestFromList(rr.mSerial);
                        // make sure this request has not already been handled,
                        // eg, if RILReceiver cleared the list.
                        if (req != null || !alreadySubtracted) {
                            rr.onError(GENERIC_FAILURE, null);
                            rr.release();
                        }
                    }
                    if (!alreadySubtracted) {
                        mRequestMessagesPending--;
                    }
                    break;
                case EVENT_WAKE_LOCK_TIMEOUT:
                    // Haven't heard back from the last request.  Assume we're
                    // not getting a response and  release the wake lock.
                    // TODO should we clean up mRequestList and mRequestPending
                    synchronized (mWakeLock) {
                        if (mWakeLock.isHeld()) {
                            if (RILJ_LOGD) {
                                synchronized (mRequestsList) {
                                    int count = mRequestsList.size();
                                    Log.d(LOG_TAG, "WAKE_LOCK_TIMEOUT " +
                                        " mReqPending=" + mRequestMessagesPending +
                                        " mRequestList=" + count);
                                    for (int i = 0; i < count; i++) {
                                        rr = mRequestsList.get(i);
                                        Log.d(LOG_TAG, i + ": [" + rr.mSerial + "] " +
                                            requestToString(rr.mRequest));
                                    }
                                }
                            }
                            mWakeLock.release();
                        }
                    }
                    break;
            }
        }
    }

特附一个简单的demo,根据感应加速度可以接电话的代码,甩下就可以接电话,环境2.0.
有没搞过这块的,交流下。


    
[2] 错误分类
    来源: 互联网  发布时间: 2014-02-18
异常分类

 

android 异常分类

 

http://hi.baidu.com/hkdao/blog/item/521390c8583f198fc817686b.html

 

一、异常:

android.view.WindowManager$BadTokenException:
 Unable to add window -- token android.os.BinderProxy@405d8c20 is not valid;
 is your activity running?

 

原因:

 

这是由于当前activity已经在后台了,后台show dialog 的时候出现的:

 

解决办法:

if(!isFinishing() && !loadDialog.isShowing()){
loadDialog.show();
}

 

 


    
[3] 施用onPause()和onSaveInstanceState保存数据
    来源: 互联网  发布时间: 2014-02-18
运用onPause()和onSaveInstanceState保存数据

public class TestPictureLayout extends Activity {

     static final int DAY_VIEW_MODE = 0;
     static final int WEEK_VIEW_MODE = 1;

     private SharedPreferences mPrefs;
     private int mCurViewMode;

     private int i;

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         SharedPreferences mPrefs = getSharedPreferences();
         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);

if(savedInstanceState!=null)

{

i=savedInstanceState.getInt("data");

//这个是之前保存的数据

}

else{

//这个是从另外一个界面进入这个时传入的

i=getIntent().getint("data");

 

}

       
     }

     protected void onPause() {
         super.onPause();
//界面失去控制权时保存数据
         SharedPreferences.Editor ed = mPrefs.edit();
         ed.putInt("view_mode", mCurViewMode);
         ed.commit();
     }
}

  @Override
public void onSaveInstanceState(Bundle outState) {

//界面销毁之前保存数据
super.onSaveInstanceState(outState);
outState.putInt("data",1);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {

//执行于onStart() 之后,回复之前保存过的数据,其实可以不要,因为oncreate中已经获取过了

super.onRestoreInstanceState(savedInstanceState);
i=savedInstanceState.getInt("data");
}

}

在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者 onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该 activity在将来某个时刻回来时可以恢复其先前状态。例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
 不要将这个方 法和activity生命周期回调如onPause()或onStop()搞混淆了,onPause()在activtiy被放置到背景或者自行销毁时总 会被调用,onStop()在activity被销毁时被调用。一个会调用onPause()和onStop(),但不触发 onSaveInstanceState的例子是当用户从activity B返回到activity A时:没有必要调用B的onSaveInstanceState(Bundle),此时的B实例永远不会被恢复,因此系统会避免调用它。一个调用 onPause()但不调用onSaveInstanceState的例子是当activity B启动并处在activity A的前端:如果在B的整个生命周期里A的用户界面状态都没有被破坏的话,系统是不会调用activity A的onSaveInstanceState(Bundle)的。
 默认的实现负责了大部分UI实例状态(的保存),采用的方式是调用UI层上每 个拥有id的view的onSaveInstanceState() ,并且保存当前获得焦点的view的id(所有保存的状态信息都会在默认的onRestoreInstanceState(Bundle)实现中恢复)。 如果你覆写这个方法来保存额外的没有被各个view保存的信息,你可能想要在默认实现过程中调用或者自己保存每个视图的所有状态。如果被调用,这个方法会 在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3