这是我制作Android应用的第一步。它是一个简单的SMS侦听器,然后将SMS显示为Toast。
public class SmsReciever extends BroadcastReceiver {
String msgBody = null;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("android.provider.Telephony.SMS_RECIEVED")){
Bundle bundle = intent.getExtras();
SmsMessage[] msg = null;
String msg_from;
if(bundle != null)
{
try{
Object[] pdus = (Object[]) bundle.get("pdus");
msg = new SmsMessage[pdus.length];
for(int i=0;i<msg.length;i++)
{
msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
msg_from = msg[i].getOriginatingAddress();
msgBody += msg[i].getMessageBody();
}
}catch(Exception e)
{
Log.d("Exception caught",e.getMessage());
}
Toast.makeText(context, msgBody, Toast.LENGTH_SHORT).show();
}
}
}}
我收到以下错误:
java.lang.RuntimeException: Unable to instantiate receiver com.example.droid.SmsReceiver: java.lang.ClassNotFoundException: com.example.droid.SmsReceiver
我向你保证SmsReciever.java在droid / src中。我整晚都在研究这个问题。请帮忙。
编辑:这是你要求的清单xml文件。
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" android:permission="android.permission.RECEIVE_SMS">
<activity
android:name=".JarvisActivity"
android:label="@string/title_activity_jarvis" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecureMessagesActivity" android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SmsReceiver" android:exported="false" >
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
编辑:我做了一些研究,发现在我的清单文件中,我有一个活动标记,指向 SecureMessagesActivity 。但在我的整个项目中,我没有这个名字的活动。这是问题所在吗?
编辑:好的,所以我从我的清单文件中删除了SecureMessageActivity部分,我猜它删除了错误。现在我收到了Permisssion拒绝消息:
Permission Denial: receiving Intent { act=android.provider.Telephony.SMS_RECEIVED flg=0x10 (has extras) } to net.learn2develop.SMSMessaging requires android.permission.RECEIVE_SMS due to sender com.android.phone (uid 1001)
我还试图使用 net.learn2develop.SMSMessaging 活动尝试复制另一个代码用于相同的目的,但现在我删除了整个项目并多次清理了我自己的项目。这项活动仍然一次又一次地出现。 的修改 Chuck it我将很快重新开始...感谢所有的投入。
答案 0 :(得分:1)
你的Adnroid清单中有接收器吗?如果是,请提供AndroidManifest.xml。您可能还想查看以下相关问题:Android - SMS Broadcast receiver,Android SMS receiver not working,BroadcastReceiver + SMS_RECEIVED。
修改强>:
尝试将android:exported="true"
添加到BroadcastReceiver
。这个接收器适合我:
<receiver android:name=".SmsBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
您现在android:exported="false"
基本上告诉Android您的BroadcastReceiver
无法从应用程序之外的来源接收消息。有关此标记的更多信息,请访问:http://developer.android.com/guide/topics/manifest/receiver-element.html。
答案 1 :(得分:0)
尝试在清单中更改您的接收器:
<receiver android:name="com.example.droid.SmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
答案 2 :(得分:0)
我知道哪些可以帮到你:让我们试试这段代码:
<receiver android:name="com.example.droid.SmsReceiver"
android:exported="true"
android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.provider.Telephony.GSM_SMS_RECEIVED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED2" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.DATA_SMS_RECEIVED" />
<data android:scheme="sms" />
<data android:host="localhost" />
</intent-filter>
</receiver>
不同类型的设备可以使用自己的操作名称,而不是标准。