【发布时间】:2012-01-11 19:02:10
【问题描述】:
我想在我的应用程序中获取电话的通话状态。我正在做一个应用程序,当用户拨打一个号码时,我的应用程序应该知道对方电话是否忙、无法访问或关机状态等。为此,我使用了 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