Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Android основан на Linux и даже можно выполнять некоторые команды Linux через методы класса Process и ProcessBuilder. Чтобы создать процесс, необходимо сначала создать экземпляр класса ProcessBuilder, передав в конструктор имя программы и его аргументы.
Сам я с Linux не знаком и практической ценности способа запуска команд этой системы не вижу. Но оставлю себе на память ради интереса.
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textViewInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</ScrollView>
package ru.alexanderklimov.linux;
package ru.alexanderklimov.as14;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Linux");
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
// Пробуйте разные варианты команд
// String[] command = {"df", "-h", "/"};
String[] command = {"df"};
// String[] command = {"ls"};
//String[] command = { "ls", "-s" };
StringBuilder cmdReturn = new StringBuilder();
try {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
InputStream inputStream = process.getInputStream();
int c;
while ((c = inputStream.read()) != -1) {
cmdReturn.append((char) c);
}
infoTextView.setText(cmdReturn.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
В Linux есть такая замечательная команда, как cat (правда-правда, спросите у любого сисадмина). С её помощью можно просматривать содержимое текстового файла. Добавьте к предыдущему примеру строку:
String[] command = { "cat", "/system/etc/permissions/handheld_core_hardware.xml" };
Ещё одна команда, которая покажет информацию о Wi-Fi:
String[] command = {"cat", "/proc/net/arp"};
Пример выдаст что-то вроде:
IP address HW type Flags HW address Mask Device
192.164.39.2 0x1 0x2 cc:7b:35:77:56 * wlan0)
Перепишем пример, считывая файл напрямую. Результат выведем в другом виде.
package ru.alexanderklimov.linux;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<Node> mNodeArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Linux");
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
mNodeArrayList = new ArrayList<>();
readAddresses();
infoTextView.setText("");
for (int i = 0; i < mNodeArrayList.size(); i++) {
infoTextView.append(i + " ");
infoTextView.append(mNodeArrayList.get(i).toString());
infoTextView.append("\n");
}
}
private void readAddresses() {
mNodeArrayList.clear();
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted.length >= 4) {
String ip = splitted[0];
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
Node thisNode = new Node(ip, mac);
mNodeArrayList.add(thisNode);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null)
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Node {
String ip;
String mac;
Node(String ip, String mac) {
this.ip = ip;
this.mac = mac;
}
@Override
public String toString() {
return ip + " " + mac;
}
}
}
Получится что-то такое:
0 192.168.4.1 cc:7b:34:77:7d:45
Можно расширить пример, узнавая по IP-адресу дополнительные сведения - Android-er: Get HostName of WiFi hotspot clients, and check if it is still connected.