Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidアプリでプログラムから着信に自動応答する方法を解説

この記事では、Androidアプリケーションからプログラムによって着信に自動応答する方法を、サンプルコードとともに段階的に解説します。電話機能を持つアプリや自動応答システムを開発したい方に役立つ内容です。

手順1:Android Studioで新規プロジェクトを作成する

まず、Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

手順2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
   xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:tools="https://schemas.android.com/tools"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello World!"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

手順3:MainActivity.java を実装する

src/MainActivity.java に以下のコードを記述します。このクラスでは、端末のAndroidバージョン(APIレベル21以降かどうか)を判定し、着信応答を担当する AcceptCallActivity を起動しています。

package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }
   public void acceptCall() {
      Context context = null;
      if (Build.VERSION.SDK_INT >= 21) {
         Intent answerCalintent = new Intent(context, AcceptCallActivity.class);
         answerCalintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         answerCalintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(answerCalintent);
      }
       else {
         Intent intent = new Intent(context, AcceptCallActivity.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent);
      }
   }
}

手順4:AcceptCallActivity.java を実装する

src/AcceptCallActivity.java に以下のコードを追加します。このアクティビティが着信応答処理の中核です。ヘッドセットのボタン操作(KEYCODE_HEADSETHOOK)を疑似的に発生させることで、プログラムから通話に応答できるようにしています。HTC端末向けのヘッドセット接続ブロードキャストや、ロック画面解除のためのウィンドウフラグ制御も含まれています。

package com.app.sample;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.view.WindowManager;
import java.io.IOException;
import java.util.logging.Logger;
public class AcceptCallActivity extends Activity {
   private static Logger logger =
   Logger.getLogger(String.valueOf(AcceptCallActivity.class));
   private static final String MANUFACTURER_HTC = "HTC";
   private KeyguardManager keyguardManager;
   private AudioManager audioManager;
   private CallStateReceiver callStateReceiver;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
      audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
   }
   @Override
   protected void onResume() {
      super.onResume();
      registerCallStateReceiver();
      updateWindowFlags();
      acceptCall();
   }
   @Override
   protected void onPause() {
      super.onPause();
      if (callStateReceiver != null) {
         unregisterReceiver(callStateReceiver);
         callStateReceiver = null;
      }
   }
   private void registerCallStateReceiver() {
      callStateReceiver = new CallStateReceiver();
      IntentFilter intentFilter = new IntentFilter();
      intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
      registerReceiver(callStateReceiver, intentFilter);
   }
   private void updateWindowFlags() {
      if (keyguardManager.inKeyguardRestrictedInputMode()) {
         getWindow().addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
      } else {
         getWindow().clearFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
      }
   }
   private void acceptCall() {
      boolean broadcastConnected = MANUFACTURER_HTC.equalsIgnoreCase(Build.MANUFACTURER) && !audioManager.isWiredHeadsetOn();
      if (broadcastConnected) {
         broadcastHeadsetConnected(false);
      }
      try {
         try {
            Runtime.getRuntime().exec("input keyevent " + Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
         }
         catch (IOException e) {
            String enforcedPerm = "android.permission.CALL_PRIVILEGED";
            Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra( Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
            Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra( Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
            sendOrderedBroadcast(btnDown, enforcedPerm);
            sendOrderedBroadcast(btnUp, enforcedPerm);
         }
      }
      finally {
         if (broadcastConnected) {
               broadcastHeadsetConnected(false);
         }
      }
   }
   private void broadcastHeadsetConnected(boolean connected) {
      Intent i = new Intent(Intent.ACTION_HEADSET_PLUG);
      i.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
      i.putExtra("state", connected ? 1 : 0);
      i.putExtra("name", "mysms");
      try {
         sendOrderedBroadcast(i, null);
      }
      catch (Exception e) {
      }  
   }
   private class CallStateReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
         finish();
      }
   }
}

手順5:AndroidManifest.xml を設定する

Manifests/AndroidManifest.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"  package="com.app.sample" >
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme" >
      <activity android:name=".MainActivity" >
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

アプリを実行して動作を確認する

それでは、アプリケーションを実行してみましょう。ここでは、実機のAndroidスマートフォンがパソコンに接続されていることを前提としています。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。表示された候補から自分のモバイルデバイスを選択すると、実機の画面にアプリのデフォルト画面が表示されます。

Androidアプリでプログラムから着信に自動応答する方法を解説

注意: 着信への自動応答は端末のセキュリティに関わる機能のため、Androidのバージョンによっては追加の権限(READ_PHONE_STATEなど)や、ユーザーの明示的な許可が必要になる場合があります。また、Google Playで公開する場合はポリシーへの適合にもご注意ください。

  1. 【Android】プログラムでアプリケーションを終了する方法|finish()とSystem.exit(0)の使い方

    はじめにこの記事では、Androidアプリをプログラム(コード)から終了させる方法を解説します。ボタンをタップするとアプリが終了するシンプルなサンプルアプリを通じて、実装手順をステップごとに見ていきましょう。ステップ1:新規プロジェクトの作成Android Studioを起動し、「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。ステップ2:レイアウトファイルの編集res/layout/activity_main.xml に以下のコードを追加します。このレイアウトには、ガイダンス用のTextViewと、アプリを終了するためのB

  2. Androidで架空の着信を設定する方法|おすすめ無料アプリ5選

    会話から抜け出したいときや、退屈なパーティーを早めに切り上げたいとき——そんな場面でも、社会常識や気遣いが邪魔をして、なかなか「帰る」と言い出せないことはありませんか。幸い、Google Playストアには、本物そっくりの架空の着信でそうした状況を救ってくれるサードパーティ製アプリが多数存在します。さらに、こうしたアプリを使えば、友人とのドッキリやいたずらを楽しむこともできます。 そこで今回は、Androidで架空の着信を設定できるおすすめアプリをご紹介します。 Fake Call 評価: 4.6点 価格: 無料 「Fake Call」を使えば、気まずい会話や退屈な会議からスムーズに抜け出せ