Android的开发提高篇(1) - 获取本地IP

本文介绍如何在Android开发中使用Java API获取设备的本地IP地址,包括通过ConnectivityManager和NetworkInfo对象判断网络状态,并通过NetworkInterface获取IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[摘要]本文介绍Android开发提高篇之获取本地IP,主要使用ConnectivityManager来实现,并提供详细的示例代码供参考。

一、概述

习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的)。好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单。下面的实现只可以获取到本地IP(内网IP),不包括外网IP,想获得外网IP的话要用其他方法。

二、实现

新建工程GetIp,修改/res/layout/main.xml文件,在里面增加一个TextView文本,完整的main.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
  
      <TextView
         android:id="@+id/nametextview"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text=" "
         android:textSize="20px"
         />
  
     <TextView
         android:id="@+id/ipTextView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text=" "
         android:textSize="20px"
         />
  
 </LinearLayout>

接着,修改GetIp.java文件,主要是声明一个ConnectivityManager对象和一个NetworkInfo对象,编写一个对话框函数,当用户没有打开网络就运行该程序时,该对话框会提示用户检查网络。完整的GetIp.java文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.nan.getip;
  
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.os.Bundle;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.util.Enumeration;
 import java.net.SocketException;
 import android.util.Log;
 import android.widget.TextView;
  
  
 public class GetIp extends Activity
 {
     private TextView ipTextView = null;
     private TextView nameTextView = null;
     //定义一个ConnectivityManager对象
     private ConnectivityManager mConnectivityManager = null;
     //定义一个NetworkInfo对象
     private NetworkInfo mActiveNetInfo = null;
  
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
  
         nameTextView = (TextView)findViewById(R.id.nametextview);
         ipTextView = (TextView)findViewById(R.id.ipTextView);
         //实例化mConnectivityManager对象
         mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);//获取系统的连接服务
         //实例化mActiveNetInfo对象
         mActiveNetInfo = mConnectivityManager.getActiveNetworkInfo();//获取网络连接的信息
         if(mActiveNetInfo==null)
             myDialog();
         else
             setUpInfo();
  
     }
  
     //获取本地IP函数
     public String getLocalIPAddress()
     {
         try
         {
             for (Enumeration<NetworkInterface> mEnumeration = NetworkInterface.getNetworkInterfaces(); mEnumeration.hasMoreElements();)
             {
                NetworkInterface intf = mEnumeration.nextElement();
                for (Enumeration<InetAddress> enumIPAddr = intf.getInetAddresses(); enumIPAddr.hasMoreElements();)
                {
                    InetAddress inetAddress = enumIPAddr.nextElement();
                    //如果不是回环地址
                    if (!inetAddress.isLoopbackAddress())
                    {
                        //直接返回本地IP地址
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
         }
         catch (SocketException ex)
         {
             Log.e("Error", ex.toString());
         }
         return null;
     }
  
     //显示IP信息
     public void setUpInfo()
     {
         //如果是WIFI网络
         if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_WIFI)
         {
             nameTextView.setText("网络类型:WIFI");
             ipTextView.setText("IP地址:"+getLocalIPAddress());
         }
         //如果是手机网络
         else if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_MOBILE)
         {
             nameTextView.setText("网络类型:手机");
             ipTextView.setText("IP地址:"+getLocalIPAddress());
         }
         else
         {
             nameTextView.setText("网络类型:未知");
             ipTextView.setText("IP地址:");
         }
  
     }
  
     //显示对话框
     private void myDialog()
     {
         AlertDialog mDialog = new AlertDialog.Builder(GetIp.this)
         .setTitle("注意")
         .setMessage("当前网络不可用,请检查网络!")
         .setPositiveButton("确定", new DialogInterface.OnClickListener()
         {
  
             @Override
             public void onClick(DialogInterface dialog, int which)
             {
                 // TODO Auto-generated method stub
                 //关闭对话框
                 dialog.dismiss();
                 //结束Activity
                 GetIp.this.finish();
             }
         })
         .create();//创建这个对话框
         mDialog.show();//显示这个对话框
     }
 }

最后,修改AndroidManifest.xml文件,在里面添加2个权限:

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

好了,不打开网络直接运行该程序,可以看到提示:

Android开发-获取本地IP

打开网络再运行该程序:

Android开发-获取本地IP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值