Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Команды Linux

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();
        }
    }
}

cat

В 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.

Дополнительное чтение

Информация о процессорах

Реклама