Dopiero zaczynam się uczyć Javy i programowania na Androida, więc proszę być wyrozumiałym 😉
Piszę prostą aplikację, która ma flashować boot.img oraz zamienić jeden plik w systemie. Po co to? Ma to służyć włączeniu/wyłączeniu modu RAM-Hack. Mniejsza o to.
Najpierw w onCreate wykonuję komendę "su" aby Superuser.apk dopuścił aplikację do root'a:
final Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("su");
}
catch (IOException e) {
e.printStackTrace();
}
Następnie zależnie od wciśniętego przycisku wykonuje się kod:
button_on.setOnClickListener(new OnClickListener(){
public void onClick(View view){
final Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("mkdir /sdcard/laszlo");
runtime.exec("wget -P /sdcard/laszlo adres/rhpack.zip");
runtime.exec("unzip -o /sdcard/laszlo/rhpack.zip -d /sdcard");
runtime.exec("rwsystem");
runtime.exec("flash_image boot /sdcard/1.img");
runtime.exec("cp /sdcard/1.ko /system/lib/modules/wlan.ko");
runtime.exec("rosystem");
runtime.exec("rm -r /sdcard/1.ko");
runtime.exec("rm -r /sdcard/1.img");
runtime.exec("reboot");
//runtime.exec("sh /system/bin/rh_on");
}
catch (IOException e) {
e.printStackTrace();
}
//Toast.makeText(getApplicationContext(), R.string.toast_on, Toast.LENGTH_SHORT).show();
}
});
button_off.setOnClickListener(new OnClickListener(){
public void onClick(View view){
final Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("mkdir /sdcard/laszlo");
runtime.exec("wget -P /sdcard/laszlo adres/rhpack.zip");
runtime.exec("unzip -o /sdcard/laszlo/rhpack.zip -d /sdcard");
runtime.exec("rwsystem");
runtime.exec("flash_image boot /sdcard/2.img");
runtime.exec("cp /sdcard/2.ko /system/lib/modules/wlan.ko");
runtime.exec("rosystem");
runtime.exec("rm -r /sdcard/2.ko");
runtime.exec("rm -r /sdcard/2.img");
runtime.exec("reboot");
//runtime.exec("sh /system/bin/rh_off");
}
catch (IOException e) {
e.printStackTrace();
}
//Toast.makeText(getApplicationContext(), R.string.toast_off, Toast.LENGTH_SHORT).show();
}
});
W logach wywala mi:
03-17 21:53:29.052: INFO/ActivityManager(165): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=pl.zezol.switch_rh/.MainActivity }
03-17 21:53:29.122: INFO/ActivityManager(165): Start proc pl.zezol.switch_rh for activity pl.zezol.switch_rh/.MainActivity: pid=991 uid=10034 gids={1015}
03-17 21:53:29.212: INFO/jdwp(991): Ignoring second debugger -- accepting and dropping
03-17 21:53:29.272: DEBUG/ddm-heap(991): Got feature list request
03-17 21:53:29.682: DEBUG/dalvikvm(991): GC freed 661 objects / 52392 bytes in 101ms
03-17 21:53:30.062: INFO/ActivityManager(165): Displayed activity pl.zezol.switch_rh/.MainActivity: 962 ms (total 962 ms)
03-17 21:53:30.302: DEBUG/su(1002): 10034:10034 pl.zezol.switch_rh executing 0:0 /system/bin/sh
03-17 21:53:34.292: WARN/flash_image(1009): error opening boot: Permission denied
03-17 21:53:34.312: INFO/flash_image(1009): flashing boot from /sdcard/2.img
03-17 21:53:34.312: ERROR/flash_image(1009): error writing boot: Permission denied
Nie mam pojęcia jakim prawem nie ma uprawnień, skoro na początku daję "su" i zapamiętuję wybór "Allow" ao.o
//Rozwiązane
Jeszcze jedno. Najlepiej by było użyć jednego przycisku ToggleButton, ale musiałbym wiedzieć jak przetworzyć wynik komendy "free" w której w "Mem" wartość "total": jeśli jest większa od 100mb to RH jest włączony, jeśli ta wartość jest mniejsza od 100mb to jest wyłączony. Tylko jak to odczytać...
Druga sprawa. Jak sparsować XML tak, aby umieścić zawarte w nim dane w widżecie? Stworzyłem mały widżet w którym chciałbym umieścić plan lekcji zależnie od dnia. Użyć jak SAXParsera? Tutaj został użyty plik XML pobrany z sieci. Zrobić to samo tylko wskazać plik na sdcard?
Pozdrawiam