我目前正在尝试创建一个应用程序,可以跟踪我在电话中花费的时间,然后在点击按钮后在吐司消息上显示该时间。
此处的代码:http://paste.ideaslabs.com/show/6INd0afyi
我似乎无法弄清楚应用程序无法正常工作的原因......
我们的想法是创建一个在我打电话后立即启动的服务(从那时起无限期地继续运行)。该服务有两个while循环,它们通过TelephonyManager类使用getCallState()方法跟踪对话的开始时间和结束时间。然后在活动类中存储和使用结束时间和开始时间变量的值。
活动类只使用一个按钮来显示一条吐司消息,告诉我花了多少时间。
当我尝试在手机上运行应用程序时,我可以看到服务正在运行,但应用程序有时会崩溃,或者只是显示调用的时间是0分钟(这不是真的......)
希望你们能指出任何错误?!
谢谢!
答案 0 :(得分:1)
只要看到您发布的代码,我就会说您没有正确阅读有关服务的文档。您不是通过执行MyService s = new MyService()
阅读Android developer guide或Android 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循环。