2011年8月12日 星期五

用Android程式列出我的XOOM的感應器

Jimmy's papa最近查一下MOTO XOOM官網的規格說明,有關Sensor的部份官網提到有

Proximity(近距離), 
ambient light(環境光), 
barometer(氣壓計), 
gyroscope(陀螺儀)

不過好像跟在其他的平板討論區提到的有點不大一樣,印象中有加速感應器(acceleration)卻沒有距離感應器(Proximity)

為求真相,Jimmy's papa只好捲起袖子動手寫程式囉!!!最後程式跑出的詳細感應器列表有一堆

KXTF9 3-axis Accelerometer,
Ambient Light sensor,
AK8975 3-axis Magnetic field sensor, 
AK8975 Orientation sensor, 
BMP085 Pressure sensor(這應該是氣壓計), 
L3G4200D Gyroscope sensor, 
Gravity Sensor, 
Linear Acceleration Sensor, 
Rotation Vector Sensor
寄件者 scratchlab
package com.jimmyscratchlab.androidsensorlist;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.os.Bundle;

public class AndroidSensorListActivity extends ListActivity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       SensorManager sensorManager
            = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
       List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);

       List<String> sensorTypeList = new ArrayList<String>();
       for(int i=0; i<sensorList.size(); i++){
           sensorTypeList.add(sensorList.get(i).getName());
       }
      
       setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
               sensorTypeList)); //Jimmy's papa查過了,simple_list_item_1是內建的
       //getListView().setTextFilterEnabled(true);
       Log.i("SensorTypeList", sensorTypeList.toString());
   }
}

2011年8月10日 星期三

多個Activity之間藉著Boundle物件傳值

Jimmy's papa覺得Android系統很像個後台有各種專職人員可提供使用者包山包海的服務,但前台的服務櫃台卻空間狹小的一次只能容身一個服務員面對使用者,為了確保服務品質不跳針,當各種專職Activity物件輪流上台時,就得藉由Boundle物件紀錄各項交辦事項

以下是Jimmy's papa將如何以Boundle物件在多個Activity之間傳值的寫法做個小整理

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="com.jimmyscratchlab.蟹堡王"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".收銀員章魚哥"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
          
        <activity android:name=".神廚海綿寶寶"></activity>  
    </application>  
    <uses-sdk android:minSdkVersion="3" />  
</manifest>   
package com.jimmyscratchlab.蟹堡王;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.MotionEvent;  
   
public class 收銀員章魚哥 extends Activity {  //Squidward
    
    private int requestCode = 110;
    
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
    }  
      
    public boolean onTouchEvent(MotionEvent event) {  
        Intent intent = new Intent();  
        intent.setClass(收銀員章魚哥.this, 神廚海綿寶寶.class);  
        Bundle mBundle = new Bundle();  
        mBundle.putInt("Petty", 5);//寫入蟹堡數量
        intent.putExtras(mBundle);  
    startActivityForResult(intent, requestCode);
        finish();  
        return super.onTouchEvent(event);  
    }
  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // 確認回傳的requestCode和resultCode
    if (requestCode == this.requestCode) {
        if (resultCode == RESULT_OK) {
            //do something..........        
        }
    }

    }    
}  

package com.jimmyscratchlab.蟹堡王;   
  
import android.app.Activity;  
import android.os.Bundle;  
  
public class 神廚海綿寶寶 extends Activity{  //SpongeBob
      
    public void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       setContentView(R.layout.main);  
       Bundle bundle = getIntent().getExtras();    
       Int petty=bundle.getInt("Petty");//讀出蟹堡數量  
       setTitle("感謝您!!!我親愛的的客人,我小神廚馬上現場製作"+petty+"個油滋滋的美味蟹堡"!!!);
       bundle.putString("toSquidward", "章魚哥,記得給客人一個笑臉,這樣客人才有美好的一天呦!!!");
       intent.putExtras(bundle);
       setResult(RESULT_OK, intent);
       finish();
    }  
}  

2011年8月3日 星期三

將XOOM內存的檔案系統掛載(mount)到Ubuntu

雖然之前Jimmy's papa已經設定好讓Ubuntu11.04認得MOTO XOOM的USB序號,但是一直無法將XOOM內存的檔案系統掛載(mount)到Ubuntu,只好借助adb或Eclipse's DDMS推拉檔案,剛好最近查到XDA論壇有篇文章教人如何Mount XOOM internal storage in Ubuntu,Jimmy's papa趁空測了一下

首先,安裝處理MTP (media transfer protocol)設備的套件

sudo apt-get install mtpfs
然後編輯這個規則檔
sudo gedit /etc/udev/rules.d/51-android.rules
加入這兩行
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"
新增目錄,並指定目錄擁有者(假設指定給jimmypapa這個帳號)
sudo mkdir /media/xoom
sudo chown jimmypapa:jimmypapa /media/xoom
然後編輯這個檔案
sudo gedit /etc/fstab
加入這兩行,可加入XOOM載入點到fstab
# mount point for moto xoom
mtpfs     /media/xoom     fuse     user,noauto,allow_other      0      0
編輯fuse.conf
sudo gedit /etc/fuse.conf
將此行開頭的#去掉
#user_allow_other
然後編輯此檔
sudo gedit /etc/group
搜尋有fuse關鍵字的那行,將你的使用者帳號名稱加入行尾,不過Jimmy's papa發覺帳號早已加入
fuse
最後將Ubuntu重開機後,就會發現點選位置選單後,xoom會出現在選單內,不過此時還不能看到XOOM的檔案目錄,必須將usb連接線插上XOOM及PC後才能存取檔案