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: 開發雜記

2012年5月24日 星期四

HTML 5 - canvas - Part IX


Introduction
Three.js含有與3D效果有關的物件

Note

2012年5月21日 星期一

HTML 5 - canvas - Part III

Introduction
KineticJS含有許多前面章節的動作,利用物件更簡單的描述出圖像、行為、動畫

Notes

2012年4月17日 星期二

Visual Studio - 設定GUI熱鍵

問題

  • 在Visual Studio的IDE介面下,設定應用程式的GUI使用tab來轉換各元件的控制權的方法
方法

  • 開啟GUI設計介面,按下Ctrl + D會在各元件旁出現數字,其數字代表控制權順序,點擊元件以設定順序

2012年4月15日 星期日

eclipse - 清除多餘的workspace

問題
  • 刪除某些workspace後,在 File > Switch Workspace 仍會出現而造成不便
方法
  1. 開啟 .\eclipse\configuration\.settings\org.eclipse.ui.ide.prefs
  2. 修改
    RECENT_WORKSPACES=C\:\\workspace1\nD\:\\workspace2
  3. 若想將 workspace2 刪除,只要將"\nD\~"之後的部份刪除即可
    RECENT_WORKSPACES=C\:\\workspace1
參考:Hanxin

2012年3月29日 星期四

ARToolKit - 更換顯示模組


目標
  • 讀入obj檔或wrl檔來更換3D模組
工具
來源
  • 修改NyARJava3D.java
方法
  • 讀入obj檔
讀入Obj檔3D模組

2012年2月29日 星期三

Eclipse - java.lang.OutOfMemory

問題
在Install New Software時,發生記憶空間不足的情況

解法

  • 在eclipse.ini中加入下列二列

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M
-XX:MaxPermSize=128M
其中128M依實體記憶體調整,目前加入後沒發生錯誤

2012年2月13日 星期一

AR - ARToolKit

環境建置 (Windows)
  • Java Develop Kit (JDK)
  • Java Media Framework (JMF)
    • 於官網下載JMF
    • 直接安裝
    • 安裝完成後測試動作
安裝完成後畫面

2012年2月9日 星期四

iOS - OfflineApp - 在HTML中讀取local image

目的
  • 將HTML中圖片的網址轉為本地端的路徑
  • 使用UIWebView元件將上述轉換後的HTML顯示出內容
問題
  1. 轉換後的路徑為file://xxx/.../xxx.jpg,但發現圖片不能正常顯示出來(文字部份可以)
解決
  1. 使用API取出的路徑除了要加上"file://"外,還要加上"localhost";故完整的路徑應為"file://localhost/xxx/.../xxx.jpg",才能顯示出來

2012年1月11日 星期三

iOS - Thread - NSOperation


目的
  • 使用NSOperationQueue達成執行緒實作
工具
  • NSOperation
    • 執行緒
  • NSOperationQueue
    • 執行緒池,將NSOperation放入交由系統執行
  • NSCondition
    • 類似JAVA中的synchronized機制,使用"lock" & "unlock"防止多執行緒同時存取相同的變數
使用範例
﹣實現Producer & Consumer

Store.h
// Store用來管理Producer及Consumer一同存取的容器 
// 故需要考慮到同步的問題,不可發生同時存取相同容器的問題 

@interface Store : NSObject 
{ 
  NSMutableArray* mProducts; NSCondition* mLocker; 
} 

- (id) initStore; 
- (void) add:(NSNumber*) product; 
- (NSNumber*) get; 

@end

Store.m
#import "Store.h"  

@implementation Store 

- (id) initStore
{
self = [super init];
if (self){
mProducts = [[NSMutableArray alloc] init];
mLocker = [[NSCondition alloc] init];
}

return self;
}

- (void) add:(NSNumber*) product
{
// 同步add product階段
[mLocker lock];
while ([mProducts count] >= 2)
{
[mLocker wait];
}
[mProducts addObject:product];
[mLocker signal];
// wake up one thread
[mLocker unlock];
}

- (NSNumber*) get
{  
// 同步get product階段
[mLocker lock];
while ([mProducts count] <= 0)  
{
[mLocker wait];
NSNumber* product = [mProducts objectAtIndex:0];
[mProducts removeObjectAtIndex:0];
[mLocker signal];
// wake up one thread
[mLocker unlock]; return product; 
}
@end

Producer.h
// 將數字放入容器中  #import "Store.h" 
@interface Producer : NSOperation
{
Store* mStore;
}

- (id) initProducer:(Store*) store;
- (void) main;

@end
Producer.m
#import "Producer.h" 
@implementation Producer
- (id) initProducer:(Store*) store
{
self = [super init];
if (self) 
{ mStore = store; } return self; } - (void) main { for (int iProduct = 1; iProduct <= 10; iProduct++) { // 隨機睡眠 0~4秒 [NSThread sleepForTimeInterval:(arc4random() % 5)]; [mStore add:[NSNumber numberWithInt:iProduct]]; NSLog(@"Produce %d", iProduct); } } @end
Consumer.h
// 將收字從容器中拿出 #import "Store.h" 
@interface Consumer : NSOperation
{
Store* mSotre;
}

- (id) initConsumer:(Store*) store;
- (void) main;

@end

Consumer.m
#import "Consumer.h"

@implementation Consumer

- (id) initConsumer:(Store*) store
{
self = [super init];
if (self)
{
mSotre = store;
}

return self;
}

- (void) main
{
for (int iLoop = 0; iLoop <= 10; iLoop++)
{
[NSThread sleepForTimeInterval:(arc4random() % 5)];

NSLog(@"Consume %d", [[mSotre get] intValue]);
}
}
@end
ViewController.h
#import "Producer.h"
#import "Consumer.h"
#import "Store.h"

@interface ViewController : UIViewController
{
NSOperationQueue* mQueue;
Producer* mProducer;
Consumer* mConsumer;
Store* mStore;
}

@end
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];

mQueue = [[NSOperationQueue alloc] init];
mStore = [[Store alloc] initStore];

// 將Store放入Producer & Consumer裡
mProducer = [[Producer alloc] initProducer:mStore];
mConsumer = [[Consumer alloc] initConsumer:mStore];

// 將Producer & Consumer放入Operation queue中,
// 開始執行Producer & Consumer
[mQueue addOperation:mProducer];
[mQueue addOperation:mConsumer];
}
Note
  • 其中"[mLocker signal];" 可代換成"[mLocker broadcast];",差別在於前者"signal"喚醒一個等待此thread的thread;而後者喚醒所有在等待此thread的thread

2012年1月10日 星期二

iOS - ASIHTTPRequest

目的
  • 用於網路溝通
工具
使用範例
﹣欲下載網路圖片如下
圖片來源
﹣Code
.h
#import <UIKit/UIKit.h>
#import "ASIHTTPRequest.h"
#import "ASINetworkQueue.h"

@interface ViewController : UIViewController <ASIHTTPRequestDelegate>
{
    NSMutableData* mDataBuf;
    ASINetworkQueue* mQue;
    NSArray* mUrls
}

@end

.m
- (void)viewDidLoad
{
  [super viewDidLoad];  
  // 下載的緩衝區
  mDataBuf = [[NSMutableData alloc] init];
  
  // 執行Request區域,類似NSOperationQueue,
  // 故在執行Request時是以執行緒方式進行,不影響原執行緒  
  mQue = [[ASINetworkQueue alloc] init];
  [mQue reset];
  [mQue setShowAccurateProgress:YES];
  [mQue go];


  // 設定下載位址

  ASIHTTPRequest* request = [[ASIHTTPRequest alloc] initWithURL:url];

  // 設ASIHTTPRequest delegate,用於回傳訊息並處理
  request.delegate = self;

  // 開始處理Request
  [que addOperation:request];
}

// ASIHTTPRequestDelegate 接收到資料後

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data
{
    [mDataBuf appendData:data];
    
    NSLog(@"Recevie %d bytes...", [data length]);
}

// ASIHTTPRequestDelegate 資料接收完成
- (void)requestFinished:(ASIHTTPRequest *)request 
{
  // 取得存放位置
  NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *path = [pathList objectAtIndex:0];    
  
  // 指定
資料夾
  path = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"/tmp/test"]];
    
  // 若指定資料夾不存在則創建
  NSFileManager* fileM = [NSFileManager defaultManager];
  NSError* error;
  if(![fileM fileExistsAtPath:path]) [fileM createDirectoryAtPath:path withIntermediateDirectories:true attributes:nil error:&error];

  //加上檔名
  path = [path stringByAppendingPathComponent: [NSString stringWithFormat: @"/00.jpg"]];
  NSLog(@"儲存路徑:%@", path);

  //寫入檔案
  [mDataBuf writeToFile:path atomically:NO];
  mDataBuf = [[NSMutableData alloc] init];
    
  NSLog(@"Download success");
}

Note
  • ASIHTTPRequestDelegate還有許多回傳方法,依需要來實作
  • 加入專案時可能會發生一堆類似的參考錯誤 "Apple Mach-O Linker (id) Error"
上述錯誤需加入sqlite3的library
進入TARGETS

依紅框指示加入參數和library,以解除其它參考的錯誤

2012年1月2日 星期一

iOS - Regular Expression

目的
  • 使NSString型態可以使用Regular Expression來表示

工具
  • RegexKitLite: 開源碼,輕量化的regular expression物件。
  • Download (官網
  • 解壓縮後將RegexKitLite.h 和 .m複製到要使用的專案中
  • 再加入"-fno-objc-arc"參數,避免ARC機制的啟動

範例
NSError* error;

// 取得Yahoo的HTML內容

NSString* tmp = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.yahoo.com.tw"] encoding:NSUTF8StringEncoding error:&error];

// 使用regular expression過濾內容
    NSString* regEx = @"<title>(.*)</title>";
    for(NSString* sub in [tmp componentsMatchedByRegex:regEx])
    {
        NSLog(sub);
    }

結果

2012年1月1日 星期日

iOS - 爬 HTML

目標
  • 抓取網頁HTML
  • 分析HTML
工具
  • libxml2: iOS原有的library,parse xml
  • 點選紅框標示的地方
    點選紅框標示的地方,最後使用“+”把libxml2加入


    在紅框的地方搜尋“other linker”,再加入“-lxml2”參數

  • Hpple: 開源碼,幫助分析HTML
    • Download
    • 將資料夾中的TFHpple, TFHppleElement, XPathQuery複製到要開發的資料夾中
    • 再加入“-fno-objc-arc”參數關閉ARC功能

範例
- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
    NSError* error;

    // 取得yahoo首頁的HTML
    NSData* data = [[NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.yahoo.com.tw"] encoding:NSUTF8StringEncoding error:&error] dataUsingEncoding:NSUTF8StringEncoding];

    // 取出title標籤中的值
    TFHpple* parser = [[TFHpple alloc] initWithHTMLData:data];   
    NSArray* values  = [parser searchWithXPathQuery:@"//title"]; // get the title
    TFHppleElement* value = [values objectAtIndex:0];
    NSString* result = [value content];

    NSLog(@"result = %@", result);
    mLabel.text = result
}

問題
  • Compile後會發生"<libxml/tree.h> not found"
    • 解:在Header search path中加入“${SDKROOT}/usr/include/libxml2”參數(${SDKROOT}會自動變為root路徑)
先在搜尋欄中搜尋“header search",再將參數輸入


結果

Qbo 機械人懂得分辨自己了

Qbo 機械人懂得分辨自己了