【发布时间】:2015-04-18 18:41:05
【问题描述】:
我正在尝试使用此应用向我的手机发送消息,但不使用网络,但我的代码不起作用。我遵循了一些教程,检查了 android dev 并没有找到任何东西(在我的 logcat 中我没有错误)。你能帮我找出我的问题吗?
我关于编译、编译器和电话的信息:
-
Android Studio 1.0.1
-
API 19 Android 4.4.4 (kitkat)
-
构建 19
-
Android 手机版本 4.4.4
清单:
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
我的主要活动的功能:
Context context;
String sender;
String body;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Get current context
context = this;
//App started
Toast.makeText(context, "Started", Toast.LENGTH_LONG).show();
CheckApp();
}
private void CheckApp() {
sender = "1234";
body = "Android sms body";
//Get my package name
final String myPackageName = getPackageName();
//Check if my app is the default sms app
if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {
//Get default sms app
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
//Change the default sms app to my app
Intent intent = new Intent( Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
startActivity(intent);
//Write the sms
WriteSms(body, sender);
//Change my sms app to the last default sms app
Intent intent2 = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent2.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);
startActivity(intent2);
}
else{
//Write the sms
WriteSms(body, sender);
}
}
//Write the sms
private void WriteSms(String message, String phoneNumber) {
//Put content values
ContentValues values = new ContentValues();
values.put(Telephony.Sms.ADDRESS, phoneNumber);
values.put(Telephony.Sms.DATE, System.currentTimeMillis());
values.put(Telephony.Sms.BODY, message);
//Insert the message
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
context.getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
}
else {
context.getContentResolver().insert(Uri.parse("content://sms/sent"), values);
}
}
嗯,这就是我想要做的,但使用的是我自己的应用程序,而不是下载到 Play 商店的应用程序 Fake Text Message。
制作假消息,我应该在我的默认短信应用上看到什么:
【问题讨论】:
-
您的应用不能设置为默认短信应用,除非其清单至少包含此处示例中显示的所有内容:Getting Your SMS Apps Ready for KitKat。此外,当
ACTION_CHANGE_DEFAULTIntent 被触发时,会弹出一个确认对话框,所以我认为您的方法不会像您期望的那样工作。 -
附带说明,如果您只是在自己的运行 4.4.4 的设备上玩耍,您可以查看my answer here 寻找可能的解决方法。
-
我阅读了文章“为 KitKat 准备好您的 SMS 应用程序”中显示的示例。我没有添加到清单中的所有额外内容似乎都用于通过网络管理短信、彩信(接收、发送)(不是我想在我的应用程序中执行的操作)。在我的应用程序中,我只想插入一条短信,例如应用程序Fake Text Message。顺便说一句,我想使用我的应用程序而不是手机。
-
如果您的代码与您发布的相同,那么这是正常的。启动 Activity - 在您的情况下,确认对话框 - 异步发生,因此在您调用
startActivity(intent)后代码执行不会暂停,并且会立即调用WriteSms()方法,此时您尚未设置您的应用程序默认。 -
非常感谢 Mike M. 的回答,我将把解决方案放在下一篇文章中。