不知道为什么代码不起作用.. Android / Java

时间:2012-07-28 18:02:54

标签: android telephonymanager

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

此处的代码:http://paste.ideaslabs.com/show/6INd0afyi

我似乎无法弄清楚应用程序无法正常工作的原因......

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

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

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

希望你们能指出任何错误?!

谢谢!

3 个答案:

答案 0 :(得分:1)

只要看到您发布的代码,我就会说您没有正确阅读有关服务的文档。您不是通过执行MyService s = new MyService()

来创建服务

阅读Android developer guideAndroid SDK documentation。您将看到例如如何启动本地服务或使用意图来启动服务。

E.g:

Intent intent = new Intent(this, HelloService.class);
startService(intent);

答案 1 :(得分: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>

}

最后不要forgate添加PHONE_STATE权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

答案 2 :(得分:0)

查看您之前的问题,我建议您阅读:How to make a phone call in android and come back to my activity when the call is done?

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

  

服务有两个跟踪开始时间和结束时间的while循环

使用PhoneStateListener这些while循环是不必要的,你可以简单地获得两个时间戳并减去差异,而不需要每毫秒运行两个while循环。