2010年11月28日 星期日

[NBA] NBA 2k11 CHEATS & CODES



Cheat : Codes

Enter the following codes by choosing "Features," > "Extras" > "Codes."

2ksports - Unlock the 2k Sports Team
2kchina - Unlock the 2k China Team
Payrespect - Unlock the ABA Ball
nba2k - Unlock the NBA2k Development Team
vcteam - Unlock the VC Squad
icanbe23 - MJ: Creating A Legend

2010年11月26日 星期五

[Android] 如何使用Google Translate API 和 Spinner 製作翻譯機



因為秉持Open Source的精神 , 所以Google 發佈了許多有趣的API給開發者拿來發揮創意 , 今天在網路上找到了Google Translate API 想先簡單的搭配 Spinner 做一個翻譯機出來試試 , 由於這個API不是存在Android 的jar檔內 , 所以我們必須先下載Google Translate 的jar檔 , 接著透過Eclipse就可以import jar檔到我們的程式當中了 , 首先到這裡去下載jar檔 , 接著在Eclipse中的 Package Explorer 中選取開發的專案 > Propertires > Java Build Path > 右邊的 Libabries > Add External JARs , 成功之後就可以發現多出一個圖示: Referenced Libabries , 裡面有剛剛加入的jar檔 , 接著試程式碼的部分




package com.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Button;

import com.google.api.translate.Language;
import com.google.api.translate.Translate;

public class GoogleTranslateSpinner extends Activity implements OnItemSelectedListener , Button.OnClickListener
{
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        AAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,LanguageNameArray);
        AAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //ArrayAdapter設定下拉式清單內容的layout格式
        //android. 開頭的範本是由Android提供的
        
        SpinnerFrom = (Spinner) findViewById(R.id.SpinnerFrom);
        SpinnerFrom.setAdapter(AAdapter);
        SpinnerFrom.setOnItemSelectedListener(this);
        SpinnerTo = (Spinner) findViewById(R.id.SpinnerTo);        
        SpinnerTo.setAdapter(AAdapter);
        SpinnerTo.setOnItemSelectedListener(this);        
        
        EditTextFrom = (EditText) findViewById(R.id.EditTextFrom);
        EditTextTo = (EditText) findViewById(R.id.EditTextTo);
        
        Button = (Button) findViewById(R.id.Button);
        Button.setOnClickListener(this);
        
        Translate.setHttpReferrer("http://shung007.blogspot.com/");
        //Translate.setHttpReferrer(" Enter the URL of your site here");
        //必要!!! 否則程式會出現Exception
    }
    
    Spinner SpinnerFrom , SpinnerTo;
    EditText EditTextFrom , EditTextTo;
    Button Button;
    
    int positionFrom , positionTo;
    
    ArrayAdapter AAdapter;
    
    public String[] LanguageNameArray = new String[]{
            "繁體中文", "CHINESE_SIMPLIFIED", "GERMAN", "ENGLISH",
            "JAPANESE", "FRENCH"
        };
    //作為顯示在Spinner裡的清單內容
    
    public Language[] LanguageCode = new Language[]{
        Language.CHINESE_TRADITIONAL, Language.CHINESE_SIMPLIFIED,
        Language.GERMAN, Language.ENGLISH, Language.JAPANESE, Language.FRENCH      
    };
    //相對應的LanguageCode , 作為之後傳遞的引數用    

 @Override
 public void onItemSelected(AdapterView parent, View view, int position,
   long arg)
 {  
  if(parent.equals(SpinnerFrom)) positionFrom = position;
  else positionTo = position;
  //判斷並記錄使用者選擇了哪個語言翻譯
 }

 @Override
 public void onNothingSelected(AdapterView arg0)
 {
  // TODO Auto-generated method stub  
 }

 @Override
 public void onClick(View ButtonView)
 {
  //按下Translate按鈕之後 , 執行翻譯的動作
  try
  {
   EditTextTo.setText(Translate.execute(EditTextFrom.getText().toString(), LanguageCode[positionFrom], LanguageCode[positionTo]));
  } catch (Exception e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }    
}




值得一提的是他支持翻譯的語言相當多 , 不只我程式中列出的六個 , 從他的Language.java可以看得出來還支持哪些語言 , 另外 , 其實這個api需要透過網路把你輸入的內容傳送到資料庫進行翻譯 , 所以別忘了設定網路權限!!!!

<uses-permission android:name="android.permission.INTERNET"/>



最後是Layout的部分













 














整個程式很精簡但是很容易就達到我們的要求 , 因為最複雜的部分google都幫我們解決了 , 真好!




相關文章


[Android] 如何使用 TextToSpeech (TTS)

2010年11月24日 星期三

[Android] 人臉偵測 FaceDetector



今天在找資料的時候無意間發現這個Class : android.media.FaceDetector 覺得相當有趣 , 馬上放下手邊的事情尋找關於FaceDetector的資料 , 找了那麼多資料所以在這邊做個統整 , 首先這邊有關於FaceDetector的Source Code  , 想進一步研究的人可以去參考 , 不過關於API Doc的描述 , 進行偵測的圖片必須是RGB565的格式 , 再來是實作程式碼的部分




import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Bundle;
import android.view.View;

 
public class FaceDetector_Test extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(new FaceView(this));
    }  
    
    public static class FaceView extends View
    {
  int imageWidth, imageHeight;
        int numberOfFace = 10;
        //自訂能偵測出的臉孔數目
        FaceDetector myFaceDetect;
        FaceDetector.Face[] myFace;
        float myEyesDistance;
        int numberOfFaceDetected;
 
        Bitmap myBitmap;
        
        public FaceView(Context context)
        {
   super(context);
   // TODO Auto-generated constructor stub
   
   BitmapFactory.Options BFO = new BitmapFactory.Options();
            BFO.inPreferredConfig = Bitmap.Config.RGB_565;
            //由於FaceDetector只能處理RGB565格式的圖片 , 所以我們要對
            //圖片進行前處理的動作
            
            myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.play, BFO);
            //從getResources()中的物件找出在res/drawable裡的圖片
            //並以RGB565處理解譯成Bitmap物件
            
            imageWidth = myBitmap.getWidth();
            imageHeight = myBitmap.getHeight();            
            myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
            //Note that the width of the image must be even.
            //Doc中有描述上面這句 , 不過不是很清楚用意
            
            myFace = new FaceDetector.Face[numberOfFace];
            //宣告一個FaceDetector.Face陣列 , 準備儲存所偵測到的臉孔位置資訊
            //所以陣列容量必定要和之前自訂的臉孔可偵測數目一樣
            
            numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);
        }
        
        @Override
        protected void onDraw(Canvas canvas)
        {
            // TODO Auto-generated method stub
 
            canvas.drawBitmap(myBitmap, 0, 0, null);
 
            Paint myPaint = new Paint();
            myPaint.setColor(Color.GREEN);
            myPaint.setStyle(Paint.Style.STROKE);
            myPaint.setStrokeWidth(3);
 
            for(int i=0; i < numberOfFaceDetected; i++)
            {
             //將每個偵測出來的臉孔當畫上框框 
                Face face = myFace[i];
                PointF myMidPoint = new PointF();
                face.getMidPoint(myMidPoint);
                //兩眼中心點的point
                myEyesDistance = face.eyesDistance();
                //兩眼之間的距離
                canvas.drawRect(
                        (int)(myMidPoint.x - myEyesDistance),
                        (int)(myMidPoint.y - myEyesDistance),
                        (int)(myMidPoint.x + myEyesDistance),
                        (int)(myMidPoint.y + myEyesDistance),
                        myPaint);
                //如果用兩眼的距離能抓到臉長寬的比例
                //畫出的框框大概就可以框住臉了
            }            
        }
    }
}

 戴眼鏡的照片而且成功的結果

 失敗的結果....臉太紅? 眼睛太假?

最後把網路上一些開發者的建議做一個整理:
1. 其實看完程式碼大概可以能知道他是靠偵測眼睛來判斷人臉的位置 , 其他五官的細節就沒辦法偵測到了 , 所以雙眼必須同時出現在照片上才可以進行偵測,並且太陽眼鏡/眼鏡會影響檢測的效果。
2. 對於要偵測圖片的Pixels建議不要小於100x100 pixels否則會偵測不到 , 但是也不要太大 , 否則偵測得過程太久還有可能出現加載圖片例外的狀況 , 大概小於800x800 pixels效果不錯。
3. 可以考慮開一個獨立的Thread來處理。
4. 經過我的測試結果 , 如果說放了一張多人團體照的話 , 但是建構子中的 int maxFaces 參數設的很小例如"2" , 我猜測此時API會取他所分析出可能是人臉中 , Rank最高的前兩名作回報 , 所以把 maxFaces 調高一點可以讓團體照偵測的結果準很多 , 對於單人照其實沒太大差別。

下面是關於findFaces function的API Doc , 我特別把一段話標了起來

public int findFaces (Bitmap bitmap, Face[] faces)

Since: API Level 1
Finds all the faces found in a given Bitmap. The supplied array is populated with 
FaceDetector.Faces for each face found. The bitmap must be in 565 format (for now).
Parameters
bitmapthe Bitmap graphic to be analyzed
facesan array in which to place all found FaceDetector.Faces. The array must be sized equal to themaxFaces value set at initialization


2010年11月23日 星期二

[Android] 如何使用Google Map 2.0 & 3.0



接續之前的文章 [Android Tips] 如何取得手機的Cell ID 和 Location Area Code , 在我們獲得Cell ID 和 Location Area Code 之後 , 轉譯成我們要的地理座標呢? 這時候需要連上Google Map API接收他轉譯好的經緯度資訊 , 網址為: http://www.google.com/glm/mmap 點進去看到錯誤訊息不要以為他壞掉了 , 其實關於如何夠過上面的網址把Cell ID 和 Location Area Code轉譯成經緯度的資訊  Wei-Meng Lee 和 poor man 的文章說得很清處 , 流程大概就是連接上網頁POST丟入參數然後解析網頁回傳的資訊。


在成功的獲得經緯度資訊後 , 就可以拿他們去呼叫Google Map定位了 , 在Google Map 3.0推出之後 , 官網呼籲開發者把2.0的版本改成3.0的 , 3.0 載入速度更快 , 尤其是在行動裝置的瀏覽器上(但是我用模擬器測試反應倒是有點慢....)


其實這次3.0的作法是希望把API放在伺服器上(有別於2.0的原生API) , 這樣開發者就不必因為Map版本得更心要手動去更新Code , 所以Google想要開發者直接把Google Map的網頁嵌入在程式內 , 所以!!! 到了3.0的版本 , 裝載Google Map的容器換成是WebView了(有別於2.0使用MapView) , 而他們的官方網頁有簡單的教學 。


接下來是2.0的部分 , 其實也不用介紹太多 , 很多網站和書籍都有範例 , 像Google 的Andorid 開發者網站就有這兩篇文章Google Map View 和 Location and Maps , Google Map API 2.0 是需要申請金鑰的 , 關於這個步驟這個網站說明的很詳細。




相關文章:

2010年11月22日 星期一

[Android] 如何取得手機的Cell ID 和 Location Area Code



甚麼是Cell ID 和 Location Area Code , 他們的用途是甚麼? 這篇文章說得很清楚了, 那在Android手機上該如何取得呢?其實步驟蠻簡單的 , 只要透過TelephonyManager即可 , 不過TelephonyManager要取得Instance , 一定要透過Context.getSystemService(Context.TELEPHONY_SERVICE).以下是簡單的代碼


if(TM.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM)
        {
         GCLocation = (GsmCellLocation) TM.getCellLocation();
         if (GCLocation != null)
         {
          int CellID = GCLocation.getCid();
                        int LAC = GCLocation.getLac();
                        Log.d("CellID",String.valueOf(CellID));
                        Log.d("LAC",String.valueOf(LAC));
                }
         else Log.d("無法獲得 GsmCellLocation 物件","");
        }
        else Log.d("這不是GSM手機","");


另外在AndoridManifest.xml中要加入一些權限


    
        
            
                
                
            
        
        
    
    
 


不過在模擬器上測試的時候回傳的 GCLocation 是 NULL , 畢竟是模擬器....
而這個opencillid網站提供了不少免費的資料 , 有了這些資料之後就算沒有GPS也可以定位了!!!



相關文章:
[Android Tips] 如何使用Google Map 2.0 & 3.0
[Android] 如何藉由Cell ID 和 Locatin Area Code 取得經緯度座標 (by Geolocation API)

Google Analytics