-2

我目前正在尝试创建一个应用程序,该应用程序可以跟踪我在电话中花费的时间,然后在单击按钮后将其显示在敬酒消息中。

代码在这里找到:http: //paste.ideaslabs.com/show/6INd0afyi

我似乎无法弄清楚为什么该应用程序无法正常工作...

这个想法是创建一个服务,只要我打电话就开始(并从那时起无限期地运行)。Service 有两个 while 循环,通过 TelephonyManager 类使用 getCallState() 方法跟踪对话的开始时间和结束时间。然后在活动类中存储和使用结束时间和开始时间变量的值。

活动类只是使用一个按钮来显示一条吐司消息,说明我花了多少时间。

当我尝试在手机上运行该应用程序时,我可以看到该服务正在运行,但该应用程序有时会崩溃或只是显示通话时间为 0 分钟(这不是真的..)

希望大家指出错误?!

谢谢!

4

3 回答 3

1

仅通过查看您发布的代码,我会说您没有正确阅读有关服务的文档。您不会通过执行来创建服务MyService s = new MyService()

阅读Android 开发人员指南Android SDK 文档。例如,您将看到如何启动本地服务或使用意图来启动服务。

例如:

Intent intent = new Intent(this, HelloService.class);
startService(intent);
于 2012-07-28T18:12:11.450 回答
1

操作系统会在某些事件发生时广播它们。例如。接收短信,电话状态(发送,接收)。通过阅读您的帖子,我认为您应该使用广播接收器注册您的应用程序。这是一个示例代码。

public class PhoneCallState extends BroadcastReceiver 
{

static long start_time, end_time;

@Override
public void onReceive(Context context, Intent intent) 
{
   final Bundle extras = intent.getExtras();

   if(intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED))
   {            
      final String state = extras.getString(TelephonyManager.EXTRA_STATE);

      if ("RINGING".equals(state))
      {
        Toast.makeText(context, "Ringing", Toast.LENGTH_LONG).show();
      }       

      if ("OFFHOOK".equals(state))
      {

        start_time = System.currentTimeMillis();
        Toast.makeText(context, "Off", Toast.LENGTH_LONG).show();
      }


      if ("IDLE".equals(state))
      {

        end_time = System.currentTimeMillis();

        long duration = (end_time - start_time) /1000;
        Toast.makeText(context, "Duration : " + duration, Toast.LENGTH_LONG).show();

      }


   }
}

并在清单文件中注册您的接收器。

<receiver android:name=".PhoneCallState">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

}

最后不要伪造添加 PHONE_STATE 权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
于 2012-07-28T22:16:33.420 回答
0

看看您以前的问题,我建议您阅读以下内容:How to make a phone call in android and come back to my Activity when the call is done?

它描述了如何设置 PhoneStateListener 以便在本地启动呼叫、从其他人接收呼叫并结束呼叫时接收意图。

Service 有两个 while 循环来跟踪开始时间和结束时间

PhoneStateListener 不需要这些 while 循环,您可以简单地获取两个时间戳并减去差值,而无需每毫秒运行两个 while 循环。

于 2012-07-28T18:39:52.730 回答