我是Android的新手,需要帮助,因为问题是我想要一个后台服务来监听传入的微笑(使用广播接收器?)然后用sms正文和电话号码发出http请求短信一到达(上传到网络服务器),尝试从头开始,想法和代码示例任何人吗? :)
public class ReceiverContainer extends Service{
public SMSreceiver mSMSreceiver;
public IntentFilter mIntentFilter;
@Override
public void onCreate()
{
super.onCreate();
//SMS event receiver
mSMSreceiver = new SMSreceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSMSreceiver, mIntentFilter);
}
@Override
public void onDestroy()
{
super.onDestroy();
// Unregister the SMS receiver
unregisterReceiver(mSMSreceiver);
mSMSreceiver = null;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public class SMSreceiver extends BroadcastReceiver
{
public void Action(Context context,Intent intent) throws ClientProtocolException, URISyntaxException, IOException
{
Bundle myBundle = intent.getExtras();
SmsMessage [] messages = null;
String strMessage = "";
String msgFrom = "";
String msgText = "";
if (myBundle != null)
{
Object [] pdus = (Object[]) myBundle.get("pdus");
messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++)
{
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
strMessage += "SMS From: " + messages[i].getOriginatingAddress();
msgFrom += messages[i].getOriginatingAddress();
strMessage += " : ";
strMessage += messages[i].getMessageBody();
msgText += messages[i].getMessageBody();
strMessage += "\n";
}
Toast.makeText(context, strMessage, Toast.LENGTH_SHORT).show();
uploadMessage(context,msgFrom,msgText);
}
}
@Override
public void onReceive(Context context, Intent intent)
{
try {
Action(context,intent);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void uploadMessage(Context context,String number,String msg) throws URISyntaxException, ClientProtocolException, IOException
{
HttpResponse response = null;
HttpClient client = new DefaultHttpClient();
Uri.Builder path = new Uri.Builder();
path.scheme("http");
path.authority("technonectar11.com");
path.path("sms");
path.appendQueryParameter("fromno" , number);
path.appendQueryParameter("text" , msg);
path.appendQueryParameter("uname" , "vijay");
HttpGet request = new HttpGet(path.build().toString());
//request.setURI(new URI("http://www.technonectar11.com/sms/insertsms?fromno="+number+"&text="+msg+"&uname=vijay"));
response = client.execute(request);
String result = convertStreamToString(response.getEntity().getContent());
Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
}
public static String convertStreamToString(InputStream inputStream) throws IOException
{
if (inputStream != null)
{
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try
{
Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),1024);
int n;
while ((n = reader.read(buffer)) != -1)
{
writer.write(buffer, 0, n);
}
}
finally
{
inputStream.close();
}
return writer.toString();
}
else
{
return "";
}
} }
这是我的完整代码,但上传消息功能不起作用
答案 0 :(得分:1)
原来我不允许在主线程上执行网络操作。它给了我一个NetworkOnMainThreadException。 我必须为此使用IntentService / AsyncTasks / Handler。
答案 1 :(得分:0)
这是与WCF Restful服务通信的示例代码,客户端代码必须是这样的
String uri = "http://youraddress:youport/" + serviceUri + "/" + methodName;
HttpPost request = new HttpPost(uri);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
JSONStringer requestMsg = new JSONStringer(); //you must fill data to this object
StringEntity msg = new StringEntity(requestMsg.toString());
msg.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
msg.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
request.setEntity(msg);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
如果您使用wcf服务作为您的应用程序服务器,这是一个示例代码
[ServiceContract(Namespace = "http://schema.abc.com/2012/01/MyServices")]
public interface IMyServices{
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "SubmitData",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
IList<CustomeClass> SubmitData(CustomeClass message);
}
您必须实现自定义类以及服务方法体,
这是配置文件,虽然你必须满足细节,但主要模式是这个
<service name="MyServices">
<endpoint address="" behaviorConfiguration="httpBehavior" binding="webHttpBinding"
contract="IMyServices" />
</service>
<endpointBehaviors>
<behavior name="httpBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>