Android應用層修改LED指示燈
今天真是不值大發了,在Java應用層修改LED指示燈的顏色,這個死問題花了我幾個小時的時間,這是多麼痛的領悟
直接上程式碼吧
public class LED extends Activity implements View.OnClickListener {
private static final String TAG = "LED";
TextView mLedTest;
int mLedStatus = 0;
private final int mLedColorRed = 0xFFFF0000;
private final int mLedColorGreen = 0xFF00FF00;
private final int mLedColorBlue = 0xFF0000FF;
final byte[] LIGHT_ON = { '2', '5', '5' };
final byte[] LIGHT_OFF = { '0' };
private final int RED = 0;
private final int GREEN = 1;
private final int BLUE = 2;
private int color = RED;
String RED_LED_DEV = "/sys/class/leds/red/brightness";
String GREEN_LED_DEV = "/sys/class/leds/green/brightness";
String BLUE_LED_DEV = "/sys/class/leds/blue/brightness";
public void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(R.layout.led_test);
mLedTest = ((TextView)findViewById(R.id.ledcolor));
mLedTest.setOnClickListener(this);
setledlightcolor(color);
mLedTest.setTextColor(mLedColorRed);
mLedTest.setText("RED");
mLedStatus = 1;
}
public void onClick(View v) {
Log.d("SamsungFactoryTestActivity", "DimmingTest---onClick---mLedStatus=" + mLedStatus);
switch (v.getId()) {
case R.id.ledcolor:
if(mLedStatus == 0) {
setledlightcolor(RED);
mLedTest.setTextColor(mLedColorRed);
mLedTest.setText("RED");
}else if(mLedStatus == 1) {
setledlightcolor(GREEN);
mLedTest.setTextColor(mLedColorGreen);
mLedTest.setText("GREEN");
}else if(mLedStatus == 2) {
setledlightcolor(BLUE);
mLedTest.setTextColor(mLedColorBlue);
mLedTest.setText("BLUE");
}else if(mLedStatus == 3) {
setledlightcolor(-1);
mLedTest.setTextColor(0xFF000000);
mLedTest.setText("END");
}else {
finish();
}
mLedStatus ++;
break;
}
}
@Override
public void finish() {
setledlightcolor(-1);
super.finish();
}
private void setledlightcolor(int color) {
logd("set:" + color);
boolean red = false, green = false, blue = false;
switch (color) {
case RED:
red = true;
break;
case GREEN:
green = true;
break;
case BLUE:
blue = true;
break;
default:
break;
}
try {
FileOutputStream fRed = new FileOutputStream(RED_LED_DEV);
fRed.write(red ? LIGHT_ON : LIGHT_OFF);
fRed.close();
FileOutputStream fGreen = new FileOutputStream(GREEN_LED_DEV);
fGreen.write(green ? LIGHT_ON : LIGHT_OFF);
fGreen.close();
FileOutputStream fBlue = new FileOutputStream(BLUE_LED_DEV);
fBlue.write(blue ? LIGHT_ON : LIGHT_OFF);
fBlue.close();
} catch (Exception e) {
loge(e);
}
}
void logd(Object d) {
Log.d(TAG, "" + d);
}
void loge(Object e) {
Log.e(TAG, "" + e);
}
}
佈局檔案很簡單,就是一個textview,用來顯示不同的文字和單擊的時候改變背景的顏色(看上去就像是螢幕的顏色改變了一樣),就不貼出來了。其實這個很簡單,在系統目錄sys/class/leds/目錄下有好多資料夾,裡面有red、green、blue等,手機連線電腦通過shell命令也可以進去檢視,這三個資料夾進去裡面都有一個叫brightness的檔案,儲存的是LED燈亮度的值,值是0-255。然後就是根據不同的需求不同的操作去修改這個值就好了,亮就寫入255(也可以是其它大於0的值),不亮就寫個0進去,具體程式碼也很簡單:
FileOutputStream fRed = new FileOutputStream(RED_LED_DEV);
fRed.write(255); // 亮
fRed.close();
程式碼就是這麼簡單了,但是總是報沒有許可權的錯(程式可以執行,但是指示燈不亮,因為值沒有寫進去。。),各種讀寫檔案的許可權加上也沒用,各種鬱悶,各種資料也查不到,後來覺得這個可能需要的系統級許可權很高,就把Android:sharedUserId="android.uid.system"這個許可權加上去了,結果就可以了!麻蛋!
當然加了android:sharedUserId="android.uid.system"許可權後就代表是系統級別的應用,在eclipse上編譯不過的,必須在原始碼環境下編譯。至於為什麼改了brightness的值指示燈的顏色就改變了,就不用我多說了,網上資料那叫一個一丟兒一丟兒的,還講的很全面很到位。
記錄記錄,以免下次還在這種問題上浪費時間。