1

我是 android 新手,需要帮助,因为问题表明我想要一个后台服务来监听传入的短信(使用广播接收器?),然后尽快为每个短信发出带有短信正文和电话号码的 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 "";
}

} }

这是我的全部代码,但是上传消息功能不起作用

4

2 回答 2

1

原来我不允许在主线程上执行网络操作。它给了我一个 NetworkOnMainThreadException。我必须为此使用 IntentService/AsyncTasks/Handler。

于 2012-10-05T07:59:02.567 回答
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);
}

您必须实现自定义类以及服务方法主体,
这是配置文件 this ,尽管您必须满足细节,但主要模式是 this

  <service name="MyServices">
            <endpoint address="" behaviorConfiguration="httpBehavior" binding="webHttpBinding"
              contract="IMyServices" />
          </service>

    <endpointBehaviors>
            <behavior name="httpBehavior">
              <webHttp/>
            </behavior>
          </endpointBehaviors>
于 2012-10-03T05:23:48.013 回答