顯示具有 [Java][Android] 標籤的文章。 顯示所有文章
顯示具有 [Java][Android] 標籤的文章。 顯示所有文章

2014年9月15日 星期一

Android 分享文字訊息至Line

Android 指定開Line App傳入文字訊息

通常Android要開啟第三方App需知道對方app的package name


 PackageManager pm = mContext.getPackageManager();
        List<applicationinfo>  appList =  pm.getInstalledApplications(0);
        for(ApplicationInfo app: appList )
        {
            Log.i("info","app:" +  app );
            if( app.packageName.equals(LINE_PACKAGE_NAME))
            {

                return true;
            }
        }

上面的方法 可以抓出手機內所有的App package name

而你會發現Line的App Package Name的名稱是 jp.naver.line.android

故當程式可用此方式來檢查是否裝此app

若要從程式碼傳送文字至 Line訊息的話


intent.setAction(Intent.ACTION_SEND);
intent = mContext.getPackageManager().getLaunchIntentForPackage(AppConfig.LINE_PACKAGE_NAME);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "this is test! oh ya!");
mContext.startActivity(intent);

上面是送文字訊息

而AndroidManifest.xml 記得要加接收到ACTION_SEND的intent filter


<intent-filter >
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter >


2014年9月1日 星期一

[android]BaseAdapter 刷新資料避免重覆內容

這幾天在Android遇到了這個問題

就是在自訂Android的BaseAdapter的時候

getView重覆進去跑了

查到有人說

listview的layout 長寬要設定為match_parent


另一種是說ListView要更新

yourAdapter.notifyDataSetChanged();

但結果還是一樣

因為我在getview去動態產生內容

所以要去把之前的layout刪除 

才不會有重覆的內容產生在listview



 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewTag viewTag;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.layout_item, null);
            viewTag = new ViewTag((TableLayout) convertView.findViewById(R.id.tableLL),
                    (TextView) convertView.findViewById(R.id.question));
            convertView.setTag(viewTag);
        }
        else
        {
            viewTag = (ViewTag) convertView.getTag();
            viewTag.tableLL.removeAllViews();
        }

2014年3月19日 星期三

Android Webview javascript與Java 互動傳參數

重點是 要先設定

webview.setWebChromeClient(new WebChromeClient());
webview.addJavascriptInterface(new JavaScriptInterface(), "android");

於 HTML 的javascript加入

function executeFromObjCall(str)
{
    alert("execute from objective c call params:" + str);
            
}


然後在你的java檔加入

webview.loadUrl("javascript:executeFromObjCall('passValue');");


這樣就可以呼叫webview javascript檔

並由java傳值到javascript

 若要從javascript呼叫java的code的話

 我們先在javascript去呼叫某個function

如call callJavaFunction:


function callJavaFunction()
{                
   var str = window.android.callJavaMethod();
   alert(str);
}


在java code去新增

 public class JavaScriptInterface {
      public String callJavaMethod() {
           
       Log.i("info", "called from javascript execute in java");
       return "this is return params from java";
   }
}

JavaScriptInterface 是在上面有new JavaScriptInterface()的關係~ 

這樣就可以透過javascript呼叫java並回傳java的值到javascript了


2013年12月18日 星期三

Android APK 反編譯 為Java檔

若要參考別人的原始碼來學習,

一種方式就是將APK檔 反編譯回 JAVA檔,

此種方式需先下載兩個檔

分別是

dex2jar

JD-GUI

首先先將 手上的apk檔 把副檔名改成壓縮檔(zip or rar...),

再將此壓縮檔解壓縮出來,你會看見有一個classes.dex檔,

我們要將此.dex檔轉成jar檔再透過JD-GUI反編譯為原始的java程式碼。

下載完dex2jar後,到dos下執行指令

dex2jar.bat  classes.dex

接下來你會看見classes.dex.dex2jar.jar的檔生成在dex2jar.bat這個目錄之下。

接下來再去執行 JD-GUI 將這個jar檔開啟..所有的程式碼就出現囉..

2013年7月23日 星期二

限制app只能在平板上執行

可以參考官網說明: http://developer.android.com/guide/practices/screens-distribution.html#FilteringTabletApps

在manifest內加入



 ... >
     android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"
                      android:requiresSmallestWidthDp="600" />
    ...
     ... >
        ...
    

其中要注意的是   android:requiresSmallestWidthDp="600" 這一項

要在properties build Target執行android 3.2以上才有支援提供,

不然你會出現以下error訊息:

No resource identifier found for attribute 'requiresSmallestWidthDp' in package 'android



Android ksoap發生status:500 error

昨天使用 ksoap 卡了幾小時的關,

錯誤訊息如下:


: W/System.err(10053): java.io.IOException: HTTP request failed, HTTP status: 500
: W/System.err(10053):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195)
: W/System.err(10053):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:116)
: W/System.err(10053):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:111)
: W/System.err(10053):  at net.xxx.ooo.activity.abc.loadWebService(HospitalVisitMain.java:147)
: W/System.err(10053):  at net.xxx.ooo.activity.abc.access$4(HospitalVisitMain.java:130)
: W/System.err(10053):  at net.xxx.ooo.activity.abc$2.run(HospitalVisitMain.java:98)
: I/info(10053): HTTP request failed, HTTP status: 500




後來發現的原因是,沒有輸入參數送到webservice,= =

網路有查到也有人遇到是ksoap的jar檔有問題,

若有遇到的人也可以嘗試更換ksoap的jar檔~

傳參數到webservice

只要加入


SoapObject request = new SoapObject(SysServerParam.getInstance()
    .getNameSpace(), SysServerParam.getInstance().getWebSiteMeth());
  

  request.addProperty("username", SysServerParam.getInstance().getUserName() );
  
  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER11);
  envelope.bodyOut = request;
  envelope.dotNet = true;
  envelope.setOutputSoapObject(request);

HttpTransportSE androidHttpTtansport = new HttpTransportSE(
    SysServerParam.getInstance().getServerURL(), 10000);

  androidHttpTtansport.debug = true;

而上面我多加了10000 是指定若網頁讀取超過10秒鐘

則跳到catch事件~

2013年6月18日 星期二

Thread(1)

Thread:

一開始執行Thread,會有自己的stack記憶體,

儲存程式的區域變數。

main本身就為一個執行緒,

我們可以使用Thread.currentThread().getName()來取得執行緒的名稱。



public class Demo{

    public static void main(String[] args)
    {
     
     for( int i = 0 ; i < 30 ; i++ )
     {
      try{
       Thread.sleep(500);
       System.out.println("i: " + i  +"/ " + Thread.currentThread().getName() );
      }
      catch(Exception ex){
   
       System.out.println("err:" + ex );
   
      }
     }
    }

}



可以由此得到 thread的名稱為 main

接下來可以建立一個MyRunner的class,

去implement Runnable interface,

若不去implement的話,可以去extends Thread並override run()也是可以。



public class MyRunner implements Runnable{

 int i = 0;

 @Override
 public void run()
 {
  while(true)
  {
   try{
    Thread.sleep(500);
    System.out.println( "i:" + i++  + "/" + Thread.currentThread().getName() );

    if( i == 20 )
    {
     break;
    }
   }
   catch(Exception ex)
   {

   }
   

  }
 }
}



然後再建一個Demo.java去產生MyRunner的instance來進行測試。



public class Demo{

    public static void main(String[] args)
    {
     
     
        MyRunner r = new MyRunner();
        Thread t1 = new Thread(r);
        t1.run();
     
for( int i = 0 ; i < 30 ; i++ )
     {
      try{
       Thread.sleep(500);
       System.out.println("m: " + i  +"/ " + Thread.currentThread().getName() );
      }
      catch(Exception ex){
   
       System.out.println("err:" + ex );
   
      }
     }
    }

}



由這裡可以發現,我是用t1.run();來執行,

其實是故意的,從這個log我們可以看見

會先產生



i: 0/main
i: 1/main
i: 2/main
i: 3/main
    ‧


i: 19/main
m:0/main



m:29/main


上面的點點點就自己以此類推,

會發現居然thread的名稱都是main ,

因為我們用run()來跑,所以其實不是多建立一個thread,

他還是以main單執行緒來進行,

若要開一條新的thread的話,

我們要把

t1.run();  改成 t1.start();

再執行一次會發現變下面的log:



m: 0/ main
i:0/Thread-1
i:1/Thread-1
m: 1/ main
i:2/Thread-1
m: 2/ main
i:3/Thread-1
m: 3/ main
i:4/Thread-1
m: 4/ main
i:5/Thread-1
m: 5/ main
i:6/Thread-1
m: 6/ main
i:7/Thread-1
m: 7/ main
m: 8/ main
i:8/Thread-1
i:9/Thread-1
m: 9/ main
i:10/Thread-1
m: 10/ main
m: 11/ main
i:11/Thread-1
i:12/Thread-1



會發現thread的名稱多了一個Thread-1,

在開thread的預設名稱會以thread-編號,

當然我們可以自己定義Thread的名稱:

依上面的程式可以利用

t1.setName("自訂Thread名稱");

或用

Thread t1 = new Thread(r, "自訂Thread名稱");


接下來我們改變一下Demo.java


public class Demo{

    public static void main(String[] args)
    {
     
     
        MyRunner r = new MyRunner();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
     
    }

}


可以發現log:



i:0/Thread-1
i:1/Thread-2
i:2/Thread-2
i:3/Thread-1
i:5/Thread-1
i:4/Thread-2
i:6/Thread-2
i:6/Thread-1
i:7/Thread-1
i:8/Thread-2
i:9/Thread-1
i:10/Thread-2
i:11/Thread-2
i:12/Thread-1
i:13/Thread-2
i:14/Thread-1
i:15/Thread-1
i:15/Thread-2
i:16/Thread-2
i:17/Thread-1
i:18/Thread-2
i:19/Thread-1



i的variable被共享了,所以在執行緒內的資源是可以共享的,

並且是Thread-safe。
☆轉載請註明出處