Nokiaと他の電話(iPhoneなど)はクラス0 SMSを送受信できることは知っていますが、Androidは可能ですか? AndroidにはAPIがありますか?
フラッシュSMSとは
Flash SMSはSMSであり、到着するとすぐに電話スクリーンに表示されます。
フラッシュメッセージを保存することを選択しない限り、離れてナビゲートするとメッセージは消え、されませんが受信トレイに保存されます。
1つの電話機に複数のフラッシュメッセージが送信された場合、最新のメッセージのみが表示され、以前のメッセージはすべて上書きされます。
クラス:このメッセージがすぐにMSに表示され、メッセージ配信レポートがSCに送り返されることを示します。メッセージは、MSまたはSIMカードに保存する必要はありません(モバイルユーザーが選択した場合を除く)。
Rooted Androidの場合、APIをバイパスしてクラス0のSMSを送信することが可能です。GitHubに ZeroSMS というプロジェクトがあります:
ZeroSMSは、クラス0を送信する方法を示す概念実証ですSMS on Android> = 2.3。
注:これはバージョン2.2-> 4.1.2でのみ機能し、sendRawPdu
メソッドが削除されたため、これを行う新しい方法を見つける必要があります。
SMS 2.2より前のバージョンでは、Flash Android(クラス0 SMSの用語)を送信できました。 GoogleはsendRawPdu APIを削除したため、リフレクションを使用したとしても、それを行うことはできません。
これが私が以前にやった方法です(これはAndroid 1.6でテストされ、機能しました)
private void sendSms(String phone, String sms) {
if ((phone == null) || (sms == null) || (phone.length() == 0)
|| (sms.length() == 0)) {
String message = "Phone or message empty!!!";
Toast notification = Toast.makeText(getBaseContext(), message,
Toast.LENGTH_SHORT);
notification.show();
return;
}
// SecurityManager oldSM = System.getSecurityManager();
// MySecurityManager newSM = new MySecurityManager();
// System.setSecurityManager(newSM);
// ServiceManager.getService("isms")
// ServiceManager.getService("isms");
SmsManager m = SmsManager.getDefault();
PendingIntent sentIntent = PendingIntent
.getBroadcast(this, 0, new Intent(
MessageStatusReceiver_MESSAGE_STATUS_RECEIVED_ACTION),
0);
PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 0,
new Intent(SmsReceiverService_MESSAGE_SENT_ACTION), 0);
// String sms = "Message self-destroyed!!!";
// String phone = "93634096";
long NOW = System.currentTimeMillis();
String time = String.valueOf(NOW);
// // m.sendTextMessage(phone, null, sms, sentIntent, deliveryIntent);
// working // m.sendTextMessage(phone, null, sms, null, null);
byte[] bb = new byte[1];
Method m2 = null;
try {
m2 = SmsManager.class.getDeclaredMethod("sendRawPdu",
bb.getClass(), bb.getClass(), PendingIntent.class,
PendingIntent.class);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// send message
SmsMessage.SubmitPdu pdus = SmsMessage.getSubmitPdu(null, phone, sms,
false);
// http://Android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=telephony/Java/Android/telephony/gsm/SmsMessage.Java;h=9ccfa90d2e24e5caea26c1deac641b3c31ae56d4;hb=c883b143ba2b8bfe2f2033d00dee9ff733f1b59c
boolean submitted = false;
try {
byte[] encodedMessage = pdus.encodedMessage;
// byte[0] = mtiByte
// byte[1] = TP Message Reference
// byte[2] = length of source phone
// byte[3..length] = phone
// protocol identifier
int msgLen = encodedMessage[2] / 2;
// +2 -> length of source phone
// +2 -> for 91 after the length
// +1 -> TP PID
int indexTPDCS = msgLen + 5;
byte TPDCS = encodedMessage[indexTPDCS];
// System.out.println(TPDCS);
System.out.println(getHexString(encodedMessage));
byte[] changedMessage = encodedMessage.clone();
// Set bit 4 to 1 using OR (|), indicating there is a message class
// Set bit 0 and 1 to 0 using AND (&), indicating class 0
byte newTPDCS = (byte) ((TPDCS | 0x10) & 0xFC); // Flash SMS
changedMessage[indexTPDCS] = newTPDCS; // Class 0
System.out.println(getHexString(changedMessage));
// Log.d(SmsScheduler_TAG, getHexString(changedMessage));
boolean send = true;
if (send) {
m2.invoke(m, pdus.encodedScAddress, changedMessage, null, null);
// sendSMS(HexDump.bytesToHexString(pdus.encodedScAddress),
// HexDump.bytesToHexString(changedMessage), null);
String message = "Flash SMS sent to " + phone
+ " successfully!";
Toast notification = Toast.makeText(getBaseContext(), message,
Toast.LENGTH_SHORT);
notification.show();
Log.d(SmsScheduler_TAG, message);
submitted = true;
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException 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();
}
// not essential, saves the SMS sent.
if (submitted) {
ContentValues values = new ContentValues();
values.put(ADDRESS, phone);
values.put(DATE, time);
values.put(READ, 0);
values.put(STATUS, -1);
values.put(TYPE, MESSAGE_TYPE_SENT);
values.put(BODY, sms);
Uri inserted = getContentResolver().insert(
Uri.parse("content://sms"), values);
}
// System.setSecurityManager(oldSM);
}
Scrool の答えは確かに正しいです https://stackoverflow.com/a/12873325/308231 、ZeroSMSはフラッシュSMSを送信するため、ただし、これは概念実証であり、7ビットエンコーディングのSMSのみをサポートします。
適切にエンコードするには、コードを変更し、if-thenまたはswitch-caseステートメントを追加する必要があるようです。7ビットコーディングの場合、英語のように
使用する (byte)0xF0
16ビットエンコーディング、UCS-2エンコーディングの場合
使用する (byte) 0x18
そうしないと、サポートされていない言語を入力すると、ジャンク文字が表示されます。
はいといいえ。それは簡単に可能ですか?いいえ。それはtomfoolery(読み取り:リフレクション)で技術的に可能ですか? 通常 。