【问题标题】:How to get a Call state of a phone [duplicate]如何获取电话的通话状态[重复]
【发布时间】:2012-01-11 19:02:10
【问题描述】:

可能重复:
Trouble with reading phone state

我想在我的应用程序中获取电话的通话状态。我正在做一个应用程序,当用户拨打一个号码时,我的应用程序应该知道对方电话是否忙、无法访问或关机状态等。为此,我使用了 com.android.internal API 他们是 调用.java<http://hi-android.info/src/com/android/internal/telephony/Call.java.html>, CallManger.java<http://hi-android.info/src/com/android/internal/telephony/CallManager.java.html> 和 Connection.java<http://hi-android.info/src/com/android/internal/telephony/Connection.java.html>。我像这样创建了 Call.java 的子类:

public class MyCall extends Call{   

  CallManager cm = CallManager.getInstance();   
  Connection c;
  Phone mDefaultPhone;
  private final ArrayList<Connection> emptyConnections = new ArrayList<Connection>();
  int size; 
  List<Call> ringingCall = cm.getForegroundCalls();

  @Override
  public List<Connection> getConnections() {             
  System.out.println("**value of list***"+ringingCall.size());      
     if(ringingCall != null && !ringingCall.isEmpty()){             
     System.out.println("inside if****");
     System.out.println("**call is not null***");
     System.out.println("value of call"+ringingCall);
     return  ((MyCall) ringingCall).getConnections();
   }
   else{
      System.out.println("**list is  null***");
          return emptyConnections;
    }       
  }
  @Override
  public Phone getPhone() {
   // TODO Auto-generated method stub
  System.out.println("**inside getPhone***");
  return null;
 }
 @Override
 public void hangup() throws CallStateException {
 // TODO Auto-generated method stub
  System.out.println("**inside hangUp***");
 }
 @Override
 public boolean isMultiparty() {
  // TODO Auto-generated method stub
  System.out.println("**inside isMultiparty***");
  return false;
 }
 public Connection
   getEarliestConnection() {
    Connection myConn = new MyConnection();
    System.out.println("inside EarliestConnection"); 
     List<Connection> l;
     long time = Long.MAX_VALUE;
     Connection c;
     Connection earliest = null;
     l = getConnections();
     System.out.println("value of connection is=="+l); 
     if (l == null) {
        return null;
      }else if ( l.size() == 0)
      {
         return null;
        }
     for (int i = 0, s = l.size() ; i < s ; i++) {
     c = (Connection) l.get(i);
     long t;
     t = c.getCreateTime();
     if (t < time) {
       earliest = c;
       time = t;
     }
   }
  return earliest;
  }
}

在这里,我得到 ringingCall.size 为 0,因为它正在执行 else 部分。还有一个类是 CallUpdate.java。

public class CallUpdate {   

   Call myCall = new MyCall();   
   CallManager cm = CallManager.getInstance();
   public Object getCallFailedString(){

     Connection myConn = myCall.getEarliestConnection();
     System.out.println("myConn is  ******"+myConn);
     System.out.println("myCall is  ******"+myCall);    
     if(myConn == null){
        System.out.println("myConn is null ******");
        return null;
     }              
      else
        {
      Connection.DisconnectCause cause = myConn.getDisconnectCause();                        
       System.out.println("myconn is not null ******"+cause);   
        switch(cause){
             case BUSY :
                System.out.println("inside busy");
          break;
        case NUMBER_UNREACHABLE :
           System.out.println("inside un-reachable");
         break;
        case POWER_OFF :
           System.out.println("inside power off");
         break;  
          }         

        }
    return myConn;
 }

}

在此代码中,获取 myConn 值为 null。我调用的 CallManger 类是这样的:

CallManager cm = CallManager.getInstance();

但是当我打印这个得到空指针异常时。 System.out.println("value of cm"+cm); 为什么会出现这个异常?谁能告诉我?

【问题讨论】:

  • 查看 logcat。 CallManager 似乎是一个内部服务,您可能没有权限访问它。
  • @Vikram 非常感谢您的回复。内部服务是什么意思?
  • @Vikram:你能告诉我解决这类问题的其他方法吗?
  • 对不起,我不知道。我可以说一件事,我认为你不应该使用内部 API,它们不应该被开发人员使用。
  • 检查这个问题这将解决你的问题stackoverflow.com/questions/8740035/…

标签: java android nullpointerexception


【解决方案1】:

您无法通过访问内部 API 直接获取通话相关信息,例如用户忙、电话关机等。出于安全原因,Android 不提供这些详细信息。 您所能做的就是跟踪日志。我们有三种日志,所以你要跟踪 仅限“无线电日志”。

它由请求和主动发出的命令组成,它们只不过是从手机调制解调器发送到 Android 操作系统的指令,反之亦然。

您会在此处找到以下行:onDisconnect Cause: XXXX,这将是您问题的答案。

【讨论】:

  • 我将在哪里获取这些日志?我想当我从我的设备拨打其他号码时应该检查 DDMS。对吗?
  • 简单使用:进程 mLogcatProc = Runtime.getRuntime().exec("logcat -v time -b radio");然后 reader = new BufferedReader(new InputStreamReader( mLogcatProc.getInputStream()));
  • :感谢您的回复。我得到了“无线电日志”。我检查了三个状态。当目标号码是(接受,拒绝和关机)。总是在断开连接原因:本地。
【解决方案2】:

你真的应该看看PhoneApp.java 中的代码。跟踪这一行,你会发现'cm = CallManager.getInstance()' 是无用的。这个问题的关键是GsmCall.java和GsmCallTracker

【讨论】:

  • 你能以适当的方式告诉我。我不明白你的意思
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多