在预付费通话结束后,能否从对话框中读取通话费用历史记录?

11

预付费用户收到的通话费用对话框所显示的数据是否可以处理?我想将所有余额减少和通话持续时间保存在我的sqlite数据库中。


1
据我所知,这是不可能的。我认为服务提供商通过USSD显示详细信息。 - midhunhk
其实,你能跟随这个链接看看是否在这里有任何有价值的信息吗?http://stackoverflow.com/questions/13509958/fetching-call-duration-from-calllog-after-call-ends-using-broadcastlistener?rq=1 - midhunhk
我看到了你的链接,这些问题之间没有相似之处。@silverback - Venkat
不确定,但尝试阅读popsup和msg.可能会有所帮助。好问题+1 - KOTIOS
你可以尝试捕获USSD: http://www.codedemigod.com/intercepting-ussd-calls-in-android/ - blindstuff
请查看此链接:http://pastie.org/9206276 - Venkat
1个回答

5

从已经著名的博客文章中我们了解到:

首先,看一下Android源代码中PhoneUtils类。 [...] 特别是,查看第217行,一个名为“com.android.ussd.IExtendedNetworkService”的意图正在被组成。所以你需要做的就是实现自己的服务来响应那个意图。该服务需要按照Android框架的IExtendedNetworkService.aidl进行实现。

从何处着手呢?最好的方法是遵循这篇更著名的博客文章

首先,我们了解基础知识:

  1. 我们需要一个实现IExtendedNetworkService接口的服务。
  2. 服务将意识到“com.android.ussd.IExtendedNetworkService”意图,因此它将在应用程序清单中具有相应的意图过滤器。
  3. 我们知道com.android.phone.PhoneUtils会绑定到这个服务。(如果你不知道什么是绑定服务,请参考这里)
  4. 当绑定成功后,我们返回一个包含PhoneUtils实际调用的函数的绑定器。
  5. 服务必须运行,因此我们需要一个广播接收器来在系统重新启动时启动服务。(如果你不知道这是什么,并且想更好地了解所有这些,请参考这里)

让我们开始吧。

首先是接收器,这部分很容易。我们创建一个名为BootReceiver.java的文件,文件内容如下:

package com.android.ussdcodes;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d("USSDService", context.getString(R.string.service_started));
        context.startService(new Intent(context,USSDDumbExtendedNetworkService.class));
    }

}

现在,让我们来看一下这个服务本身。虽然我没有亲自尝试过,但我已经在这里读过代码,以找到方法的解释,并将其放入注释中。我还进行了一些编辑。
据我所知,在getUserMessage方法中,您将收到实际文本,因此您可以解析该文本,并返回要在弹出窗口中显示的内容。如果您不想要弹出窗口,请返回null。因此,您还应在此处处理该文本的任何其他内容。
public class USSDDumbExtendedNetworkService extends Service {

public static final String TAG = "ExtNetService";
public static CharSequence mRetVal = null;
public static boolean mActive = true;
private boolean change = false;
private String msgUssdRunning = null;

private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() {


    //Set a MMI/USSD command to ExtendedNetworkService for further process. This should be called when a MMI command is placed from panel.
    //we don't need it in this case
    @Override
    public void setMmiString(String number) throws RemoteException {

    }



    //return the specific string which is used to prompt MMI/USSD is running

    @Override
    public CharSequence getMmiRunningText() throws RemoteException {
        return msgUssdRunning;
    }

    //Get specific message which should be displayed on pop-up dialog.
   Parameters:
   text original MMI/USSD message response from framework
   Returns:
   specific user message correspond to text. null stands for no pop-up dialog need to show.
    @Override
    public CharSequence getUserMessage(CharSequence text)
            throws RemoteException {
         return text;
    }
   //Clear pre-set MMI/USSD command. This should be called when user cancel a pre-dialed MMI    command.
    //we don't need it in this case
    @Override
    public void clearMmiString() throws RemoteException {
    }
};

@Override
public IBinder onBind(Intent intent) {
    msgUssdRunning = "Some text to show";

    return mBinder; 
}

public IBinder asBinder() {
    return mBinder;
}

@Override
public boolean onUnbind(Intent intent) {
    return super.onUnbind(intent);
}}

最后一部分,清单文件。您必须注册服务和广播接收器。

<receiver android:name="com.android.ussdcodes.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    /intent-filter>
</receiver>

<service android:name=".USSDDumbExtendedNetworkService" >
    <intent-filter android:icon="@drawable/ic_launcher">
        <action android:name="com.android.ussd.IExtendedNetworkService" />
            <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

1
这只可能在 Android 4.2.2 之前的版本中实现。在 4.2.2 中,由于安全风险,Google 已经移除了 IExtendedNetworkService。请参见 Google 发布的问题(https://code.google.com/p/android/issues/detail?id=57120)。 - Rogier van der Wel
谢谢!我不知道那个。USSD的一切都很棘手,我担心我们必须继续关注Android在下一个版本中会做什么。 - Carlos Robles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接