« DVD → mp4 変換例 | メイン | タイトルバーとアイコン »

Android

簡単なAndroidアプリ

Android Studio 1.5.1 をインストールできたところで、早速 簡単なAndroidアプリを。
WiFiデバックすることが多いのでアンドロイド端末のIPアドレスなど ネットワーク情報を取得・表示させるだけのアプリ。
Android Studio で新規プロジェクトを作成。
 ↓
Empty Activity を選択。
http://www.yukun.info/blog/2010/05/java-networkinterface-ipv6-ipv4.html
に綺麗なソースが公開されていたので show() の代わりに toString() を追加。
●app/src/main/java/example/myapplication/InetAddressesInfo.java
package example.myapplication;

import java.net.Inet6Address;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;

public class InetAddressesInfo{
    private HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap;

    public InetAddressesInfo(){
        interfaceMap = new HashMap<NetworkInterface, ArrayList<InetAddress>>();
    }

    public void getInterfaces(){
        interfaceMap.clear();
        try{
            Enumeration<NetworkInterface> interfaceList = NetworkInterface.getNetworkInterfaces();
            if( interfaceList == null ){
                System.out.println( "Message: No interfaces found" );
            }else{
                while( interfaceList.hasMoreElements() ){
                    NetworkInterface iface = interfaceList.nextElement();
                    Enumeration<InetAddress> addrList = iface.getInetAddresses();
                    if( !addrList.hasMoreElements() )    continue;
                    ArrayList<InetAddress> iaddress = new ArrayList<InetAddress>();
                    while( addrList.hasMoreElements() )
                        iaddress.add( addrList.nextElement() );
                    interfaceMap.put( iface, iaddress );
                }
            }
        } catch( SocketException se ){
            System.out.println( "Error getting network interfaces: " + se.getMessage() );
        }
    }

    public void show(){
        for( NetworkInterface n : interfaceMap.keySet() ){
            System.out.println( "Interface " + n.getName() + ": " );
            for( InetAddress a : interfaceMap.get(n) ){
                System.out.print("\tAddress " + ((a instanceof Inet4Address ? "(IPv4)"
                        : (a instanceof Inet6Address ? "(IPv6)" : "(?)"))) );
                System.out.println( ": " + a.getHostAddress() );
            }
        }
    }

    public String toString(){
        String str="";
        for( NetworkInterface n : interfaceMap.keySet() ){
            str += "Interface " + n.getName() + ": \n";
            for( InetAddress a : interfaceMap.get(n) ){
                str += "\tAddress " + (
                    (a instanceof Inet4Address ? "(IPv4)":
                        (a instanceof Inet6Address ? "(IPv6)" : "(?)")
                    )
                );
                str += ": " + a.getHostAddress() + "\n";
            }
        }
        return str;
    }

    public HashMap<NetworkInterface, ArrayList<InetAddress>> getInterfaceMap(){
        return interfaceMap;
    }

    public static void main( String[] args ){
        InetAddressesInfo i =    new InetAddressesInfo();
        i.getInterfaces();
        i.show();
    }
}
●ネットワークリソースをアクセスする権限付与(★行:追加・変更)。
app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.myapplication">

★  <uses-permission android:name="android.permission.INTERNET"/>
★  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
●ハードコーディング Hello・・・ の代わりにプログラムからアクセスするシンボルを定義。
app/src/main/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="example.myapplication.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
★      android:id="@+id/textView" />
</RelativeLayout>
●メイン
app/src/main/java/example/myapplication/MainActivity.java
package example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

★      TextView textView = (TextView)findViewById( R.id.textView );
★      InetAddressesInfo i = new InetAddressesInfo();
★      i.getInterfaces();
★      textView.setText( i.toString() );
    }
}

コンパイル面倒な方には
http://www.remix.asia/dat/apk/

Ipconfig.apk
を。

トラックバック

このエントリーのトラックバックURL:
http://www.remix.gr.jp/cgi/mt/mt-tb.cgi/7508

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)