안 드 로 이 드 개발 이 실현 한 전화 도청 과 차단 응용

이 사례 는 안 드 로 이 드 개발 이 실현 한 전화 도청 과 차단 애플 리 케 이 션 을 다 루 고 있다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
오늘 은 프로 세 스 간 Service 의 통신->AIDL 을 배 웠 습 니 다.며칠 전에 배 운 방송 체 제 를 바탕 으로 저 는 간단 한 전화 도청 과 녹음 응용 을 했 습 니 다.지금 구체 적 인 실현 방법 을 아래 에 첨부 하여 여러분 께 참고 하 시기 바 랍 니 다.여러분 께 서 귀중 한 의견 을 제공 해 주시 기 바 랍 니 다.
업무 수요 분석:
1.핸드폰 이 켜 진 상태 에 있 으 면 감청 서비스 가 시작 되 고 전 화 를 감청 하여 녹음 해 야 한다.
2.전화 블랙 리스트 를 설정 하고 전화 가 블랙 리스트 전화 일 때 바로 끊 는 다.
실현 절차:
우선 전화 감청 서 비 스 를 정의 하고 전화 감청 녹음 과 차단 을 해 야 한다.구체 적 인 코드 는 다음 과 같다.
PhoneListenerService:

package cn.yj3g.L21_PhoneListener;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
public class PhoneListenerService extends Service {
  private MediaRecorder recorder;
  private boolean recording = false;
  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
  @Override
  public void onCreate() {
    Log.v("TAG", "service onCreate()");
    super.onCreate();
    //      
    TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    //      
    manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
  }
  private PhoneStateListener listener = new PhoneStateListener() {
    /*
     * @see TelephonyManager#CALL_STATE_IDLE   0
     *
     * @see TelephonyManager#CALL_STATE_RINGING   1
     *
     * @see TelephonyManager#CALL_STATE_OFFHOOK   2
    */
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
      super.onCallStateChanged(state, incomingNumber);
      //          
      Log.v("TAG", "onCallStateChanged state=" + state);
      switch (state) {
      case TelephonyManager.CALL_STATE_IDLE: //           
        stopRecord();
        break;
      case TelephonyManager.CALL_STATE_RINGING: //    
        stop(incomingNumber);
        break;
      case TelephonyManager.CALL_STATE_OFFHOOK: //     
        recordCalling();
        break;
      default:
        break;
      }
    }
  };
  //    
  private void stopRecord() {
    Log.v("TAG", "stopRecord");
    if (recording) {
      recorder.stop();
      recorder.release();
      recording=false;
    }
  }
  //    
  public void stop(String s) {
    try {
      if (s.equals("110")) {
        Toast.makeText(this, "    ", 0).show();
        Log.e("TAG", "         ,    !");
        //  ITelephony.endCall()    
        Method method = Class.forName("android.os.ServiceManager")
            .getMethod("getService", String.class);
        IBinder binder = (IBinder) method.invoke(null,
            new Object[] { TELEPHONY_SERVICE });
        ITelephony telephony = ITelephony.Stub.asInterface(binder);
        telephony.endCall();
      } else
        Toast.makeText(this, "    ", 0).show();
      recording=false;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  //    
  private void recordCalling() {
    try {
      Log.v("TAG", "recordCalling");
      recorder = new MediaRecorder();
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //        
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//     .3gp
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//     
      recorder.setOutputFile(Environment.getExternalStorageDirectory()
          .getAbsolutePath()
          + "/"
          + System.currentTimeMillis()
          + ".3gp");//         sdcard   
      recorder.prepare();
      recorder.start();
      recording = true;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

안 드 로 이 드 는 통 화 를 끝 낸 API 를 대외 적 으로 공개 하지 않 았 으 며,통 화 를 종료 하려 면 AIDL 을 이용 해 전화 관리 서비스 와 통신 하고,서비스 에 있 는 API 를 호출 해 통 화 를 종료 해 야 한다.방법 은 다음 과 같다.
1.Android 소스 코드 에서 다음 파일 을 항목 으로 복사 합 니 다.

com/android/internal/telephony/ITelephony.aidl
android/telephony/NeighboringCellInfo.aidl

다음 그림 에서 보 듯 이 개발 도 구 는 gen 디 렉 터 리 에서 ITelephony.자바 를 자동 으로 생 성 합 니 다.

우 리 는 서비스 가 스스로 작 동 할 수 없고 수 동 으로 작 동 해 야 한 다 는 것 을 알 기 때문에 우 리 는 라디오 가 필요 하 다.핸드폰 이 켜 지 자마자 우 리 는 방송 을 보 내 고 감청 전 화 를 시작 하 는 서 비 스 를 시작 해 야 한다.다음은 제 가 쓴 라디오 를 보 낸 Receiver 입 니 다.
BootCompleteReceiver:

package cn.yj3g.L21_PhoneListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootCompleteReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    //            
    Log.v("TAG", "   !");
      Intent i = new Intent(context, PhoneListenerService.class);
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//            ,              
      context.startService(i);
  }
}

다음은 AndroidManifest.xml 에 관련 권한 을 설정 하 는 것 입 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="cn.yj3g.L21_PhoneListener"
   android:versionCode="1"
   android:versionName="1.0">
  <uses-sdk android:minSdkVersion="8" />
  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <service android:name=".PhoneListenerService">
      <intent-filter>
       <action android:name="cn.yj3g.L21_PhoneListener.PhoneListenerService" ></action>
      </intent-filter>
    </service>
    <receiver android:name=".BootCompleteReceiver">
      <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
  </application>
   <!--         -->
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
   <!--      -->
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <!--  sdcard        -->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <!--           -->
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <!--            -->
   <uses-permission android:name="android.permission.CALL_PHONE" />
</manifest>

이렇게 감청 전화의 응용 프로그램 이 완성 되 었 다.이 앱 을 설치 한 휴대 전화 가 켜 졌 을 때 전 화 는 감청 상태 에 있 기 때문에 이 휴대 전화의 전 화 를 감청 녹음 하거나 차단 하여 남 에 게 말 할 수 없 는 목적 을 달성 할 수 있다.
PS:Android Manifest 기능 과 권한 설정 에 대한 자세 한 내용 은 본 사이트 의 온라인 도 구 를 참고 하 십시오.
Android Manifest 기능 과 권한 설명:
http://tools.jb51.net/table/AndroidManifest
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기