-2

現在、通話に費やした時間を追跡し、ボタンをクリックした後にトースト メッセージに表示できるアプリを作成しようとしています。

ここにあるコード: http://paste.ideaslabs.com/show/6INd0afyi

アプリが起動しない原因がわかりません...

アイデアは、電話をかけるとすぐに開始されるサービスを作成することです (そして、それ以降は無期限に実行され続けます)。Service には、TelephonyManager クラスで getCallState() メソッドを使用して会話の開始時刻と終了時刻を追跡する 2 つの while ループがあります。そして、終了時間変数と開始時間変数の値が保存され、アクティビティ クラスで使用されます。

アクティビティ クラスでは、ボタンを使用して、費やした時間を示すトースト メッセージを表示するだけです。

携帯電話でアプリを実行しようとすると、サービスが実行されていることがわかりますが、アプリがクラッシュするか、通話にかかった時間が 0 分と表示されます (これは正しくありません..)

間違いがあれば指摘していただけると幸いです?!

ありがとう!

4

3 に答える 3

1

オペレーティングシステムが発生したときにブロードキャストするイベントがいくつかあります。例えば。SMSの受信、通話状態(送信、受信)。あなたの投稿を読んで、私はあなたがあなたのアプリを放送受信機に登録するべきだと思います。これがサンプルコードです。

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 に答える
1

投稿したコードを見るだけで、サービスに関するドキュメントを適切に読んでいないと言えます。を実行してサービスを作成するのではありませんMyService s = new MyService()

Android デベロッパー ガイドまたはAndroid SDK ドキュメントをお読みください。たとえば、ローカル サービスを開始する方法や、インテントを使用してサービスを開始する方法がわかります。

例えば:

Intent intent = new Intent(this, HelloService.class);
startService(intent);
于 2012-07-28T18:12:11.450 に答える
0

以前の質問を見て、これを読むことをお勧めします: How to make a phone call in android and come back to my activity when the call is done?

通話がローカルで開始され、他の人から受信され、終了したときにインテントを受信できるように、PhoneStateListener をセットアップする方法について説明します。

Service には、開始時刻と終了時刻を追跡する 2 つの while ループがあります。

これらの while ループは PhoneStateListener では不要です。ミリ秒ごとに 2 つの while ループを実行することなく、単純に 2 つのタイム スタンプを取得して差を引くことができます。

于 2012-07-28T18:39:52.730 に答える