2017年2月24日 星期五

[Android] EditText讀取Bar Code Scanner的內容

程式碼如下


 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //only catch need char (different with every one) 
        char unicodeChar = (char) event.getUnicodeChar();
        if (((keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_Z) || unicodeChar == '-') )
        {
            isInput = true;
            unicodeChar = (char) event.getUnicodeChar();
            sb.append(unicodeChar);
            //wait a delay time 500ms for read all data ( adjustment for your bar code scanner)
            if (isInput) {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (sb.length() != 0) {
                            String str = sb.toString();
                            //save your String to UI Component
                        isInput = false;
                    }
                }, DELAY);
            }
        }

        return false;
    }

我們透過OTG連接條碼掃描器,經過測試,有以下個注意事項。

(1)不是每台平板都支援OTG。

(2)不同平板對於條碼掃出來的結果可能會有差異。

2.1 有些平板,掃描出來的內容顯示到EditText極慢,像單手打一樣,難以判斷是輸入完成沒,或是出現異常的換行符號,掃描一組條碼可能出現多行換行。

2.2 OTG供電可能不穩定,導致條碼機異常。

(3)OTG接頭不要買線太細的,容易供電不足,小小一個轉換頭也不賴。

經驗分享,使用前請進行測試 。

(4)其實你可以以條碼的檢查碼進行確認是否己讀取完畢,不過此案用的這支條碼掃描器是可以自己識別多種格式條碼的,所以用這種檢查方式比較不適合 。

[NetBeans]將maven專案打包成可執行的JAR檔

一開始用Netbeans開發完的程式,想要直接執行JAR檔是不行的,會顯示


xxx.jar 中沒有主要資訊清單屬性

需要在pom.xml中加入一些設定,讓它編譯出來是可以獨立執行的JAR檔。

將以下內容包在<project> 與</project>中

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.mycompany.your_project.MainClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

說明一下以下這段的意思

<mainClass>com.mycompany.your_project.MainClass</mainClass>

例如我的Main在Main.java中,而我的package是com.boywhy.cool 。

則需要寫成

<mainClass>com.boywhy.cool.Main</mainClass>

假如你原本編譯出來的JAR檔名字為xxx-1.0-SNAPSHOT.jar

加入這段後編譯出來的JAR檔名字為

加入這一段之後編譯就會多出這個xxx-1.0-SNAPSHOT-jar-with-dependencies.jar檔案,

請執行這一個新的檔案,才能夠獨立執行。

2017年2月22日 星期三

[Android] Webview 中點連結會開啟其他瀏覽器

最近使用WebView時遇到了一個問題,當我載入一個網頁後,

只要點點選連結,或是網頁裡的submit後就會要求開啟其他瀏覽器

(如果只有裝一種瀏覽器,就會直接由內建的瀏覽器開啟網頁,離開APP)。

我們先來看一下程式碼,載入YAHOO首頁(勿戰,因為它連結多,好示範)


import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;

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


        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("https://tw.yahoo.com");
    }
}

再來看看我說的情況,Yahoo是一個比較特別的網址,手機連上去會自己轉到手機版頁面,

所以會直接就跳出用瀏覽器開啟的要求。
































所以為了以防以上所提到的幾種問題,需要加入一段程式碼,設定WebView Client來處理

WebView中發生的其他事件。


import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends Activity {

    WebViewClient mWebViewClient;

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


        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
       
        mWebViewClient = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //process redirect URL
                view.loadUrl(url);
                return true;
            }
        };
        //set WebviewClient  to handle click hyper link , post...
        webView.setWebViewClient(mWebViewClient);
        webView.loadUrl("https://tw.yahoo.com");
    }


}

看看結果




點選連結之後

參考連結: