Androidは、電話の傍受や傍受機能の開発を実現します。
本明細書で述べた内容はAndroidシステムにおいて、どのようにプログラムを書いて電話遮断を行うかということであり、ブロック警告を出してユーザに警告するものであり、この機能はまだ実用的であると言える。
1、電話でブロックする
この機能はご存知かもしれませんが、反射原理でITelephoneを呼び出す隠れた方法で実現します。
2、遮断後、アラーム/空番/シャットダウンしました/停止しました。
この機能は実はMMIコマンドを使用しています。具体的にはコール転送の指定はここを参照してください。http://baike.baidu.com/view/206402.html?fromTaglist。
本稿では、「緊急転送」の機能を使用します。中国移動の設定方式は*67〓〓電話番号〓〓で、取消方式は〓〓〓〓67〓〓です。無条件移行「67の代わりに21を使えばいいです。この二つのコマンドは携帯電話のダイヤル画面に直接入力してダイヤルしてテストできます。ITelephoneのendcallの方法は電話を切った後で、電話が忙しいことをヒントにします。事前にセットしておけば、忙しい時に空番/シャットダウンしました。停止した電話番号は空番/シャットダウンしました。
実は、みんなはxxx衛士をダウンロードして見てもいいです。着信拒否モードを設定すると、MMIコマンドを設定する画面が起動します。その後、「設定-」通話設定->>電話の受け渡し」に行って、「通話中の受け渡し」に設定されている電話番号を見ると、空の番号/オフ/停止済みの電話番号が分かります。
1、BLOCKED_を修正してください。NUMBERという変数値は、ブロックをテストする電話番号に設定します。
2、全部の機能は一つのActivityで実現されますので、皆さんはまずこのActivityを実行して、「呼び出し転送設定」をクリックして、呼び出しの転送を設定してから、このActivityをオフにしないでください。消したら電話が止められなくなります。心強い友達は自分でServiceを書いてバックグラウンドでブロック機能を実行します。
実現方式1:
コードは以下の通りです
1、カバンandroid.refuseCallingを作ります。
refuseCalling.javaコードは以下の通りです。
Neigh boringCelInfo.aidlコードは以下の通りです。
package android.telephone;
3、カバンを作る。comp.android.intternal.telephone。
ITelephone.aidlコードは以下の通りです。
1、電話でブロックする
この機能はご存知かもしれませんが、反射原理でITelephoneを呼び出す隠れた方法で実現します。
2、遮断後、アラーム/空番/シャットダウンしました/停止しました。
この機能は実はMMIコマンドを使用しています。具体的にはコール転送の指定はここを参照してください。http://baike.baidu.com/view/206402.html?fromTaglist。
本稿では、「緊急転送」の機能を使用します。中国移動の設定方式は*67〓〓電話番号〓〓で、取消方式は〓〓〓〓67〓〓です。無条件移行「67の代わりに21を使えばいいです。この二つのコマンドは携帯電話のダイヤル画面に直接入力してダイヤルしてテストできます。ITelephoneのendcallの方法は電話を切った後で、電話が忙しいことをヒントにします。事前にセットしておけば、忙しい時に空番/シャットダウンしました。停止した電話番号は空番/シャットダウンしました。
実は、みんなはxxx衛士をダウンロードして見てもいいです。着信拒否モードを設定すると、MMIコマンドを設定する画面が起動します。その後、「設定-」通話設定->>電話の受け渡し」に行って、「通話中の受け渡し」に設定されている電話番号を見ると、空の番号/オフ/停止済みの電話番号が分かります。
1、BLOCKED_を修正してください。NUMBERという変数値は、ブロックをテストする電話番号に設定します。
2、全部の機能は一つのActivityで実現されますので、皆さんはまずこのActivityを実行して、「呼び出し転送設定」をクリックして、呼び出しの転送を設定してから、このActivityをオフにしないでください。消したら電話が止められなくなります。心強い友達は自分でServiceを書いてバックグラウンドでブロック機能を実行します。
実現方式1:
コードは以下の通りです
package net.toeach.android.callforwarding;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import com.android.internal.telephony.ITelephony;
/**
* , ( )
* @author Tony from ToEach.
* @email [email protected]
*/
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private final static int OP_REGISTER = 100;
private final static int OP_CANCEL = 200;
private final static String BLOCKED_NUMBER = "1892501xxxx";//
// , 13800000000 ,
private final String ENABLE_SERVICE = "tel:**67*13800000000%23";
//
private final String DISABLE_SERVICE = "tel:%23%2367%23";
private IncomingCallReceiver mReceiver;
private ITelephony iTelephony;
private AudioManager mAudioManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.btnEnable).setOnClickListener(new OnClickListener(){
public void onClick(View v) {
//
Message message = mHandler.obtainMessage();
message.what = OP_REGISTER;
mHandler.dispatchMessage(message);
}
});
findViewById(R.id.btnDisable).setOnClickListener(new OnClickListener(){
public void onClick(View v) {
//
Message message = mHandler.obtainMessage();
message.what = OP_CANCEL;
mHandler.dispatchMessage(message);
}
});
mReceiver = new IncomingCallReceiver();
IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
registerReceiver(mReceiver, filter);// BroadcastReceiver
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// endcall
TelephonyManager telephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try {
Method getITelephonyMethod = TelephonyManager.class.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
iTelephony = (ITelephony) getITelephonyMethod.invoke(telephonyMgr, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
}
private Handler mHandler = new Handler() {
public void handleMessage(Message response) {
int what = response.what;
switch(what) {
case OP_REGISTER:{
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(ENABLE_SERVICE));
startActivity(i);
break;
}
case OP_CANCEL:{
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(DISABLE_SERVICE));
startActivity(i);
break;
}
}
}
};
private class IncomingCallReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
Log.i(TAG, "State: "+ state);
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.d(TAG, "Incomng Number: " + number);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){//
if(number.equals(BLOCKED_NUMBER)){//
//
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Log.d(TAG, "Turn ringtone silent");
try {
//
iTelephony.endCall();
} catch (RemoteException e) {
e.printStackTrace();
}
//
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
}
}
}
}
Android Manifest.xmlは以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android "
package="net.toeach.android.callforwarding"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
</manifest>
実装方法2:1、カバンandroid.refuseCallingを作ります。
refuseCalling.javaコードは以下の通りです。
package android.refuseCalling;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
import com.android.internal.telephony.ITelephony;
public class refuseCalling extends Activity {
private static final String TAG = "Telephony";
private TextView view = null;
private TelephonyManager tManager = null;
private ITelephony iTelephony = null;
// ,
private final String ENABLE_SERVICE = "tel:**67*13800000000%23";
// ,
private final String ENABLE_POWEROFF_SERVICE = "tel:**67*13810538911%23";
// ,
private final String ENABLE_STOP_SERVICE = "tel:**21*13701110216%23";
//
private final String DISABLE_SERVICE = "tel:%23%2321%23";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
TelephonyManager mTelephonyMgr = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyMgr.listen(new TeleListener(),
PhoneStateListener.LISTEN_CALL_STATE);
//gui
view = new TextView(this);
view.setText("listen the state of phone
");
setContentView(view);
tManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
// iTelephony
Class <TelephonyManager> c = TelephonyManager.class;
Method getITelephonyMethod = null;
try {
getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null);
getITelephonyMethod.setAccessible(true);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
iTelephony = (ITelephony) getITelephonyMethod.invoke(tManager, (Object[])null);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(ENABLE_STOP_SERVICE));
startActivity(i);
Log.v(TAG, " ");
}
class TeleListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: {
Log.e(TAG, "CALL_STATE_IDLE");
view.append("CALL_STATE_IDLE " + "
");
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
Log.e(TAG, "CALL_STATE_OFFHOOK");
view.append("CALL_STATE_OFFHOOK" + "
");
break;
}
case TelephonyManager.CALL_STATE_RINGING: {
Log.e(TAG, "CALL_STATE_RINGING");
view.append("CALL_STATE_RINGING" + "
");
try {
iTelephony.endCall();
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
}
default:
break;
}
}
}
protected void onStop() {
super.onStop();
}
protected void onDestroy() {
super.onDestroy();
finish();
Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse(DISABLE_SERVICE));
startActivity(i);
}
}
2、カバンandroid.telephoneを作ります。Neigh boringCelInfo.aidlコードは以下の通りです。
package android.telephone;
3、カバンを作る。comp.android.intternal.telephone。
ITelephone.aidlコードは以下の通りです。
/*
*
* Licensed under the android License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import android.os.Bundle;
import java.util.List;
import android.telephony.NeighboringCellInfo;
//import com.FrameSpeed.NeighboringCellInfo;
/**
* Interface used to interact with the phone. Mostly this is used by the
* TelephonyManager class. A few places are still using this directly.
* Please clean them up if possible and use TelephonyManager insteadl.
*
* {@hide}
*/
interface ITelephony {
/**
* Dial a number. This doesn't place the call. It displays
* the Dialer screen.
* @param number the number to be dialed. If null, this
* would display the Dialer screen with no number pre-filled.
*/
void dial(String number);
/**
* Place a call to the specified number.
* @param number the number to be called.
*/
void call(String number);
/**
* If there is currently a call in progress, show the call screen.
* The DTMF dialpad may or may not be visible initially, depending on
* whether it was up when the user last exited the InCallScreen.
*
* @return true if the call screen was shown.
*/
boolean showCallScreen();
/**
* Variation of showCallScreen() that also specifies whether the
* DTMF dialpad should be initially visible when the InCallScreen
* comes up.
*
* @param showDialpad if true, make the dialpad visible initially,
* otherwise hide the dialpad initially.
* @return true if the call screen was shown.
*
* @see showCallScreen
*/
boolean showCallScreenWithDialpad(boolean showDialpad);
/**
* End call if there is a call in progress, otherwise does nothing.
*
* @return whether it hung up
*/
boolean endCall();
/**
* Answer the currently-ringing call.
*
* If there's already a current active call, that call will be
* automatically put on hold. If both lines are currently in use, the
* current active call will be ended.
*
* TODO: provide a flag to let the caller specify what policy to use
* if both lines are in use. (The current behavior is hardwired to
* "answer incoming, end ongoing", which is how the CALL button
* is specced to behave.)
*
* TODO: this should be a oneway call (especially since it's called
* directly from the key queue thread).
*/
void answerRingingCall();
/**
* Silence the ringer if an incoming call is currently ringing.
* (If vibrating, stop the vibrator also.)
*
* It's safe to call this if the ringer has already been silenced, or
* even if there's no incoming call. (If so, this method will do nothing.)
*
* TODO: this should be a oneway call too (see above).
* (Actually *all* the methods here that return void can
* probably be oneway.)
*/
void silenceRinger();
/**
* Check if we are in either an active or holding call
* @return true if the phone state is OFFHOOK.
*/
boolean isOffhook();
/**
* Check if an incoming phone call is ringing or call waiting.
* @return true if the phone state is RINGING.
*/
boolean isRinging();
/**
* Check if the phone is idle.
* @return true if the phone state is IDLE.
*/
boolean isIdle();
/**
* Check to see if the radio is on or not.
* @return returns true if the radio is on.
*/
boolean isRadioOn();
/**
* Check if the SIM pin lock is enabled.
* @return true if the SIM pin lock is enabled.
*/
boolean isSimPinEnabled();
/**
* Cancels the missed calls notification.
*/
void cancelMissedCallsNotification();
/**
* Supply a pin to unlock the SIM. Blocks until a result is determined.
* @param pin The pin to check.
* @return whether the operation was a success.
*/
boolean supplyPin(String pin);
/**
* [ASD2-ES1|Connice|2011.04.14]
*/
boolean supplyPuk(String puk, String pin);
/**
* Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated
* without SEND (so <code>dial</code> is not appropriate).
*
* @param dialString the MMI command to be executed.
* @return true if MMI command is executed.
*/
boolean handlePinMmi(String dialString);
/**
* Toggles the radio on or off.
*/
void toggleRadioOnOff();
/**
* Set the radio to on or off
*/
boolean setRadio(boolean turnOn);
/**
* Request to update location information in service state
*/
void updateServiceLocation();
/**
* Enable location update notifications.
*/
void enableLocationUpdates();
/**
* Disable location update notifications.
*/
void disableLocationUpdates();
/**
* Enable a specific APN type.
*/
int enableApnType(String type);
/**
* Disable a specific APN type.
*/
int disableApnType(String type);
/**
* Allow mobile data connections.
*/
boolean enableDataConnectivity();
/**
* Disallow mobile data connections.
*/
boolean disableDataConnectivity();
/**
* Report whether data connectivity is possible.
*/
boolean isDataConnectivityPossible();
Bundle getCellLocation();
/**
* Returns the neighboring cell information of the device.
*/
List<NeighboringCellInfo> getNeighboringCellInfo();
int getCallState();
int getDataActivity();
int getDataState();
/**
* Returns the current active phone type as integer.
* Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE
* and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE
*/
int getActivePhoneType();
/**
* Returns the CDMA ERI icon index to display
*/
int getCdmaEriIconIndex();
/**
* Returns the CDMA ERI icon mode,
* 0 - ON
* 1 - FLASHING
*/
int getCdmaEriIconMode();
/**
* Returns the CDMA ERI text,
*/
String getCdmaEriText();
/**
* Returns true if OTA service provisioning needs to run.
* Only relevant on some technologies, others will always
* return false.
*/
boolean needsOtaServiceProvisioning();
/**
* Returns the unread count of voicemails
*/
int getVoiceMessageCount();
/**
* Returns the network type
*/
int getNetworkType();
/**
* Return true if an ICC card is present
*/
boolean hasIccCard();
}
parcelable NeighboringCellInfo;
4、Android Manifest.xmlコードは以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.refuseCalling"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".refuseCalling"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
この文を通じて、Androidの電話アプリを開発する友達に助けを提供したいです。ありがとうございます。