2014年3月11日 星期二

利用Dropbox API上傳檔案到雲端(Android)

前言

因為一些因素,終於接觸到了這類的實作,以下就簡單介紹如何利用Dropbox提供的API來將檔案上傳到雲端,我要應用的層面很單純,就是讓APP可以自動將一些數據儲存成文字檔並上傳到Dropbox資料夾中。

簡易步驟

1.首先,Dropbox提供了3種不同類型的API給開發者使用,而我們這次將使用的是Sync API,現在就請先把這個版本的Android SDK下載到自己的電腦裡吧!

2.我們直接用他現成的範例來示範....欸!    或許你會問"都有現成的範例了,那你這篇到底是要講什麼".....    原因就是,他這個現成的範例不是說import進來就馬上可以用了,還有一些步驟要做,這邊提供的就是一個"懶人包程序"

3.將剛剛下載的檔案解壓縮出來之後在eclipse之中import "/dropbox-android-sync-sdk-2.1.0/examples/HelloDropbox" 這個專案有顯示紅色叉叉是正常的接著將資料夾中libs下的檔案複製到HelloDropbox的libs中

4.對HelloDropbox專案點右鍵選擇Android Tools->Add Support Library然後.....範例專案就可以用了簡單吧!!

注意事項

那如果說你要將這個API用到你自己新增的專案上,除了上述該複製的或是該點選的之外,還有兩點就是必須要注意的:

  • 第一,你必須先申請你自己專案的APP_KEY及APP_SECRET,網址在這,程式碼中,你可以很容易就找到哪邊是要替換成你自己專案的APP_KEY及APP_SECRET,
  • 第二,也是最容易被忽視的,就是Androimanifest.xml中也必須替換成該專案的APP_KEY,註明如下:
<activity android:name="com.dropbox.sync.android.DbxAuthActivity" />
<activity
 android:name="com.dropbox.client2.android.AuthActivity"
   android:launchMode="singleTask" >
 <intent-filter>
   <data android:scheme="你申請到的Key代碼" />
   <action android:name="android.intent.action.VIEW" />
   <category android:name="android.intent.category.BROWSABLE" />
   <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
</activity>

這整段是你要使用這個API本來就要複製貼上到你自己的Androimanifest中的,但紅色標記出卻是很容易被忽略要一起改的地方,所以你可能怎麼試,APP都一直崩潰.....

總結

萬事起頭難,現在可以試試將這個API融合到自己的專案中瞜~~~

2013年12月10日 星期二

將Android webview的內容轉換成 string 的方法

最近與學弟妹準備一項比賽,其中需要連到特定網站將其HTML內容轉換成String儲存下來,具體實現的方法及遇到的問題描述如下: 
1. 於layout.xml新增一webview元件
2. 將 <uses-permission android:name="android.permission.INTERNET" /> 加入專案設定檔 Manifest.xml中
3. 在主程式碼中建立各種網路的設定, 主要程式碼如下

@SuppressLint("JavascriptInterface")
public class MainActivity extends Activity {

private WebView _webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findviews();
webviewsetting();
_webview.loadUrl("http://tw.yahoo.com/");
}

private void findviews()
{
_webview = (WebView) findViewById (R.id.webView1);
}

@SuppressLint("SetJavaScriptEnabled")
private void webviewsetting()
{
WebSettings webSettings = _webview.getSettings();
webSettings.setSavePassword(false);
webSettings.setJavaScriptEnabled(true);
_webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HTMLOUT");
_webview.setWebChromeClient(new WebChromeClient());
_webview.setWebViewClient(new WebViewClient() {

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

_webview.loadUrl("javascript:window.HTMLOUT.showHTML" +
                        "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
});
}

class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface(Context ctx) {
            this.ctx = ctx;
        }

        @JavascriptInterface
        public void showHTML(String html) {
            new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html)
                    .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
        }

    }
}


說明:
利用getSettings()方法取得webview的設定元件

webSettings.setJavaScriptEnabled(true);
_webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HTMLOUT");
這兩行可以想成是讓webview元件可以執行javascript,並且加入MyJavaScriptInterface此一類別所建立的javascript介面


在onPageFinished此一方法中,是當webview將網頁載入完成後會執行的方法,因此我們就是要在這個地方將webview的內容轉換成string 儲存起來
透過_webview.loadUrl("javascript:window.HTMLOUT.showHTML" +
                        "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
便可呼叫MyJavaScriptInterface 此一類別中的 showHTML方法將webview內容已AlertDialog已顯示出來,android call javascript 便是透過 javascript:xxx  來進行使用。

筆者的手機是LG Optimus G,可以正常使用



但強者我同學的Z1卻在網頁載入完成後遲遲沒有對話視窗跳出來,在筆者多方嘗試下後發現在public void showHTML(String html) 此一方法上方加入@JavascriptInterface可解決這個問題,而如果是用模擬器的話似乎怎麼樣都不會有反應。

以上提供給各位參考,歡迎提出問題指教喔~