2013年3月19日 星期二

DownloadManager


目的
使用DownloadManager下載檔案,並取出下載進度

問題

  1. permission denial
    解:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  2. 使用 DownloadManager.Request.VISIBILITY_HIDDEN 時,發生SecurityException
    解:
    加入<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />


實作
public class DownloadActivity extends Activity {

 private TextView mConsole;

 private void setupUnit() {
  mConsole = (TextView) findViewById(R.id.console);
 }

 private void init() {

 }

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_download);

  setupUnit();
  init();

  Downloader d = new Downloader();
  d.download(this, "http://www.wall001.com/1280x1024/"
    + "1280_1024_nature_scene_wallpapers_06/"
    + "mxxx01/1280_1024_nature_wallpaper_3210710877.jpg");
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_download, menu);
  return true;
 }

 private Handler mHander = new Handler() {
  public void handleMessage(Message msg) {
   String log = (String) msg.obj;

   mConsole.append(log);
  }
 };

 private class Downloader {
  
  DownloadManager downloadManager;
  long downloadId;
  boolean is = true;
  Cursor c;

  public void download(Context context, String url) {
   
   downloadManager = (DownloadManager) context
     .getSystemService(Context.DOWNLOAD_SERVICE);
   Uri uri = Uri.parse(url);

   downloadId= downloadManager.enqueue(new DownloadManager.Request(
     uri)
     .setAllowedNetworkTypes(
       DownloadManager.Request.NETWORK_WIFI |  
       DownloadManager.Request.NETWORK_MOBILE)
     .setAllowedOverRoaming(false)
     .setNotificationVisibility(
       DownloadManager.Request.VISIBILITY_HIDDEN)
     .setDestinationInExternalPublicDir(
       Environment.DIRECTORY_DOWNLOADS, "test.jpg"));

   final Query query = new DownloadManager.Query();   
   query.setFilterById(downloadId);

   // 取出下載進度
   new Thread(new Runnable() {
    
    long size = 0;
    long total = 0;

    @Override
    public void run() {
     
     while (is) {
      c = downloadManager.query(query);
      if (c != null) {
       if (c.moveToFirst()) {
        size = c.getInt(c
          .getColumnIndex(
              downloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        total = c.getLong(c
          .getColumnIndex(downloadManager.COLUMN_TOTAL_SIZE_BYTES));

        mHander.sendMessage(mHander.obtainMessage(-1,
          "Progress- " + size + " / " + total
            + "\n"));

        if (size == total)
         is = false;
       }
      }

      try {
       Thread.sleep(500);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    }
   }).start();
  }
 }
}

2012年10月11日 星期四

Menu 與 ActionBar 不同版本下運作

Google發表3.0以後版本會捨棄menu鍵,取而代之的是虛擬框架ActionBar,但3.0版本以下並不支援此框架。

而在3.0以下開發的程式到了3.0以上的平台時,可能會發生不支援menu按鍵,而且在畫面也不會顯示ActionBar的框架,造成無法正常使用。

故在開發時,想讓menu內的功能既可在3.0以下時以menu鍵方式呈現,而3.0以上時以ActionBar方式呈現


  • 方法
    • 在AndroidManifest.xml中
      <uses-sdk
              android:minSdkVersion="10"
              android:targetSdkVersion="15" />
    • minSdkVersion設制3.0以下
    • targetSdkVersion設制在3.0以上
    • application標籤下的theme設置
      <application
             android:theme="@android:style/Theme.Holo" >
    • 使用3.0以上的sdk編譯
  • 問題
    1. 在開發模式時,無法在3.0以下平台編譯
    • 但release成apk後是可以安裝,並以menu鍵方式正常應用

Sony Xperia Table S 開啓USB偵錯模式發生錯誤

http://www.sony-asia.com/support/faq/474618/product/sgpt112sg

以上連結為官方提供的方法,但Xperia table s使用上述方法驅動程式仍無法安裝成功,在硬體管理員中還是黃色問號

進入裝置查看識別碼發現與官方提供的識別碼不太相同,所以在官方提供的方法下再新增一行識別碼,才能讓驅動程式安裝成功

解法


新增SONY sony tablet S2

  • 加入
    ;SONY Sony Tablet S2
    %CompositeAdbInterface% = USB_Install, USB\VID_054C&PID_06AD&MI_01

2012年8月13日 星期一

Pandaboard on Eclipse

目的
在Pandaboard開發Android時,理想是透過Eclipse直接將apk放在Pandaboard上執行。由於在初始時是無法透過USB判定到Pandaboard,需先從SDK Manager中下載Google USB Driver,再將驅動裝上才能抓到Pandaboard。

方法

  • On Ubuntu (12.04):
    • Change the mode to debug in our Android
    • Open the terminal
    • Enter the vendor ID to adb_usb.ini (一定要進入super user模式)
      $ sudo su 
      <psswd> 
      $ mkdir ~/.android 
      $ vi ~/.android/adb_usb.ini 
      $ echo "0x0451" > ~/.android/adb_usb.ini 
      $ cat /root/.android/adb_usb.ini 
      0x0451
    • Restart the adb
      $ cd <path>/android-sdks/platform-tooles 
      $ ./adb kill-server 
      $ ./adb start-server
      
    • Check the devices
      $ ./adb devices
    • We can get the Pandaboard platform successfully.
  • On Windows:
    • 開啟cmd介面
    • 鍵入以下指令
      > echo 0x0451 > "%USERPROFILE%\.android\adb_usb.ini"
      > type "%USERPROFILE%\.android\adb_usb.ini"
      0x0451
    • 開啟".\Android\android-sdk\extras\google\usb_driver\android_winusb.inf"
    • 找尋[Google.NTx86] (若為64bit的,找尋[Google.NTamd64]),鍵入以下指令
      ; OMAP-3/4
      %SingleAdbInterface% = USB_Install, USB\VID_0451&PID_D101
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D102&MI_01
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D106&MI_02
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D107&MI_03
      %SingleAdbInterface% = USB_Install, USB\VID_0451&PID_FFFFE
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_FFFE&MI_01
      %SingleAdbInterface% = USB_Install, USB\VID_0451&PID_D022
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D022&MI_01
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D10A&MI_01
      
      ; OMAP-3 / 4 - ICS
      %CompositeAdbInterface% = USB_Install, USB\VID_0451&PID_D109&MI_01
    • 將Pandaboard的USB與PC接上

    • 開啟控制台的裝置管理員,會看到一個打問號的device(OMAP或Panda之類的)
    • 點選右鍵來更新驅動程式 (路徑:.\Android\android-sdk\extras\google\usb_driver)
    • 安裝完後重開機,成功的話

Reference: OMAPPedia

2012年8月5日 星期日

Android 4.0 ICS on Pandaboard

二種將Android 4.0 ICS在Pandaboard執行的方法
  • 透過SD卡
    • 較簡單
  • PC透過USB
    • 較復雜
    • 需下載Android source code來產生img

2012年7月25日 星期三

FTP client


找尋可在Android上使用的FTP client library,用於傳輸檔案到FTP server中
  • edtFTPJ
    • License: LGPL
    • 付費版具Security
  • FTPClient
    • License: ASF
決定使用FTPClient
  • 將上面二種library參考到Android程式當中,皆會發生NoClassDefFoundError
    • 解法:將library直接匯入到程式的libs資料夾中
  • 由於上面的原因,故採用較小容量的FTPClient
Usage
public class MainActivity extends Activity {

 private static final String TAG = "MainActivity";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int port = 21;
        
        String ftpAddress = "127.0.0.1";
        String username = "potato";
        String password = "123456";
        String root = "/sdcard";
        String remoteRoot = "/test";
        
        FileInputStream inputStream = null;  
        FTPClient client = null;

        try {
            client = new FTPClient();            

            client.setConnectTimeout(1000);
            client.connect(ftpAddress, port);
            client.login(username, password);
            
            client.setFileType(FTP.BINARY_FILE_TYPE);
            client.enterLocalPassiveMode();

            for(int i = 0;i<3;i++)
            {
             try {
          inputStream = new FileInputStream(root + "/" + i + ".jpg");
          } catch (FileNotFoundException e) {
           e.printStackTrace();
          }
                client.appendFile(remotRoot + "/" + i + ".jpg", inputStream);
             inputStream.close();
            }            
            client.disconnect();
            
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        
    }
}

2012年7月9日 星期一

在Facebook Developer登記application

  1. 建立一個應用程式



  2. 製作Android app的key,藉由cmd (藉由eclipse)



  3. 將key轉為hash key供facebook developer使用 (需先裝openssl)



  4. 編輯App



  5. 將hash key加入app



  6. 複製APPID放入APP中



Reference: 開發雜記