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);
}

2014年10月17日 星期五

Android-筆記 WebView 覆寫 WebViewClient

WebView new 一個 WebViewClient 的話,可以處理

  • onReceivedError-網頁讀取失敗 
  • onPageStarted-開始讀取網頁 
  • onPageFinished-網頁讀取結束 
  • shouldOverrideUrlLoading-是否用自定瀏覽器開啟連結 

   mWebView.setWebViewClient(new WebViewClient() {
            
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//                super.onReceivedError(view, errorCode, description, failingUrl);
                view.loadData("<html></html>", "text/html", null);
                findViewById(R.id.LayoutError).setVisibility(View.VISIBLE);
                findViewById(R.id.ButtonRefresh).setOnClickListener(new OnClickListener() {
                    
                    @Override
                    public void onClick(View v) {
                        findViewById(R.id.LayoutError).setVisibility(View.GONE);
                        initLayout();
                    }
                });
                
            }
            
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                
                mProgressDialog = new ProgressDialog(EventActivity.this);
                mProgressDialog.setMessage(getResources().getString(R.string.reading));
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                mProgressDialog.show();
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {

                mProgressDialog.dismiss();
                super.onPageFinished(view, url);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
            
                view.loadUrl(url);
                return true;
            }
        });

2014年10月7日 星期二

Android-筆記 ViewPager 自動撥放 & 無限循環

自動撥放的部分
可以引用第三方lib

 lib來源:https://github.com/Trinea/android-auto-scroll-view-pager 
文章來源:http://www.trinea.cn/android/auto-scroll-view-pager/

若要實現無限循環
就要改寫adapter
本法是在 getCount 的時候
回傳無限大
 

import java.util.List;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;

public class MyViewPagerCircleAdapter extends PagerAdapter {

 public List views;

 public MyViewPagerCircleAdapter(List views) {
  this.views = views;
 }

 @Override
 public void destroyItem(View collection, int position, Object arg2) {
 }

 @Override
 public void finishUpdate(View arg0) {
 }

 @Override
 public int getCount() {
  return Integer.MAX_VALUE;
 }

 @Override
 public Object instantiateItem(View collection, int position) {
  try {
   ((ViewPager) collection).addView(
     views.get(position % views.size()), 0);
  } catch (Exception e) {
  }
  return views.get(position % views.size());
 }

 @Override
 public boolean isViewFromObject(View view, Object object) {
  return view == (object);
 }

 @Override
 public void restoreState(Parcelable arg0, ClassLoader arg1) {
 }

 @Override
 public Parcelable saveState() {
  return null;
 }

 @Override
 public void startUpdate(View arg0) {
 }
}