2014年10月21日 星期二

Android-筆記 Intent URL PostData

通常使用 Intent 開啟 外部網頁 URL,
只要直接把 Uri 帶進 Intent 啟動就可以了,
但是如果要用到 Post 來傳送資料的話,
可以使用以下這個方法。

String html = getPayHtml(); //取得要傳送的POST資料
String dataUri = "data:text/html," + URLEncoder.encode(html).replaceAll("\\+","%20");
    
Intent i = new Intent();
i.setComponent(new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"));
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse(dataUri));
startActivity(i);

getPayHtml() 這個funtion是讀取要 Post 的 Form,
網頁放在 res/raw 下面

private String getPayHtml() {
 String html = readTrimRawTextFile(this, R.raw.round);
        return html;
}

 private static String readTrimRawTextFile(Context ctx, int resId) {
     InputStream inputStream = ctx.getResources().openRawResource(resId);

     InputStreamReader inputreader = new InputStreamReader(inputStream);
     BufferedReader buffreader = new BufferedReader(inputreader);
     String line;
     StringBuilder text = new StringBuilder();
     try {
         while ((line = buffreader.readLine()) != null) {
             text.append(line.trim());
         }
     }
     catch (IOException e) {
         return null;
     }
     return text.toString();
 }
來看一下 round.html 寫了什麼?
postUrl是要傳送的目標網址,
 name 和 value 改成要傳送的值。


<html>
    <body onLoad="document.getElementById('form').submit()">
        <form id="form" target="_self" method="POST" action="postUrl">

   <input type="hidden" name="howgo" value="2" />
   <input type="hidden" name="id2" value="" />
   <input type="hidden" name="go2sn" value="" />
   <input type="hidden" name="id3" value="" />
   <input type="hidden" name="go3sn" value="" />

        </form>
    </body>
</html>

但是有些手機會發生找不到預設瀏覽器的問題,
所以 Intent 可以改成這樣:
String html = getPayHtml(); //取得要傳送的POST資料
String dataUri = "data:text/html," + URLEncoder.encode(html).replaceAll("\\+","%20");
    
Intent i = new Intent();
i.setComponent(getDefaultBrowserComponent(this)); //找出預設的瀏覽器
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse(dataUri));
startActivity(i);
public static ComponentName getDefaultBrowserComponent(Context context) {
     Intent i = new Intent()
         .setAction(Intent.ACTION_VIEW)
         .setData(new Uri.Builder()
                 .scheme("http")
                 .authority("x.y.z")
                 .appendQueryParameter("q", "x")
                 .build()
                 );
     PackageManager pm = context.getPackageManager();
     ResolveInfo default_ri = pm.resolveActivity(i, 0); // may be a chooser
     ResolveInfo browser_ri = null;
     List rList = pm.queryIntentActivities(i, 0);
     for (ResolveInfo ri : rList) {
         if (ri.activityInfo.packageName.equals(default_ri.activityInfo.packageName)
          && ri.activityInfo.name.equals(default_ri.activityInfo.name)
         ) {
             return ri2cn(default_ri);
         } else if ("com.android.browser".equals(ri.activityInfo.packageName)) {
             browser_ri = ri;
         }
     }
     if (browser_ri != null) {
         return ri2cn(browser_ri);
     } else if (rList.size() > 0) {
         return ri2cn(rList.get(0));
     } else if (default_ri == null) {
         return null;
     } else {
         return ri2cn(default_ri);
     }
}

private static ComponentName ri2cn(ResolveInfo ri) {
  return new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
}

沒有留言:

張貼留言