Android应用开发提高篇(1)-----获取本地IP
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html
一、概述
习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的)。好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单。下面的实现只可以获取到本地IP(内网IP),不包括外网IP,想获得外网IP的话要用其他方法。
二、实现
新建工程GetIp,修改/res/layout/main.xml文件,在里面增加一个TextView文本,完整的main.xml文件如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7
8 <TextView
9 android:id="@+id/nametextview"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:text=" "
13 android:textSize="20px"
14 />
15
16 <TextView
17 android:id="@+id/ipTextView"
18 android:layout_width="fill_parent"
19 android:layout_height="wrap_content"
20 android:text=" "
21 android:textSize="20px"
22 />
23
24 </LinearLayout>
接着,修改GetIp.java文件,主要是声明一个ConnectivityManager对象和一个NetworkInfo对象,编写一个对话框函数,当用户没有打开网络就运行该程序时,该对话框会提示用户检查网络。完整的GetIp.java文件如下:
1 package com.nan.getip;
2
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.content.DialogInterface;
6 import android.net.ConnectivityManager;
7 import android.net.NetworkInfo;
8 import android.os.Bundle;
9 import java.net.InetAddress;
10 import java.net.NetworkInterface;
11 import java.util.Enumeration;
12 import java.net.SocketException;
13 import android.util.Log;
14 import android.widget.TextView;
15
16
17 public class GetIp extends Activity
18 {
19 private TextView ipTextView = null;
20 private TextView nameTextView = null;
21 //定义一个ConnectivityManager对象
22 private ConnectivityManager mConnectivityManager = null;
23 //定义一个NetworkInfo对象
24 private NetworkInfo mActiveNetInfo = null;
25
26 /** Called when the activity is first created. */
27 @Override
28 public void onCreate(Bundle savedInstanceState)
29 {
30 super.onCreate(savedInstanceState);
31 setContentView(R.layout.main);
32
33 nameTextView = (TextView)findViewById(R.id.nametextview);
34 ipTextView = (TextView)findViewById(R.id.ipTextView);
35 //实例化mConnectivityManager对象
36 mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);//获取系统的连接服务
37 //实例化mActiveNetInfo对象
38 mActiveNetInfo = mConnectivityManager.getActiveNetworkInfo();//获取网络连接的信息
39 if(mActiveNetInfo==null)
40 myDialog();
41 else
42 setUpInfo();
43
44 }
45
46 //获取本地IP函数
47 public String getLocalIPAddress()
48 {
49 try
50 {
51 for (Enumeration<NetworkInterface> mEnumeration = NetworkInterface.getNetworkInterfaces(); mEnumeration.hasMoreElements();)
52 {
53 NetworkInterface intf = mEnumeration.nextElement();
54 for (Enumeration<InetAddress> enumIPAddr = intf.getInetAddresses(); enumIPAddr.hasMoreElements();)
55 {
56 InetAddress inetAddress = enumIPAddr.nextElement();
57 //如果不是回环地址
58 if (!inetAddress.isLoopbackAddress())
59 {
60 //直接返回本地IP地址
61 return inetAddress.getHostAddress().toString();
62 }
63 }
64 }
65 }
66 catch (SocketException ex)
67 {
68 Log.e("Error", ex.toString());
69 }
70 return null;
71 }
72
73 //显示IP信息
74 public void setUpInfo()
75 {
76 //如果是WIFI网络
77 if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_WIFI)
78 {
79 nameTextView.setText("网络类型:WIFI");
80 ipTextView.setText("IP地址:"+getLocalIPAddress());
81 }
82 //如果是手机网络
83 else if(mActiveNetInfo.getType()==ConnectivityManager.TYPE_MOBILE)
84 {
85 nameTextView.setText("网络类型:手机");
86 ipTextView.setText("IP地址:"+getLocalIPAddress());
87 }
88 else
89 {
90 nameTextView.setText("网络类型:未知");
91 ipTextView.setText("IP地址:");
92 }
93
94 }
95
96 //显示对话框
97 private void myDialog()
98 {
99 AlertDialog mDialog = new AlertDialog.Builder(GetIp.this)
100 .setTitle("注意")
101 .setMessage("当前网络不可用,请检查网络!")
102 .setPositiveButton("确定", new DialogInterface.OnClickListener()
103 {
104
105 @Override
106 public void onClick(DialogInterface dialog, int which)
107 {
108 // TODO Auto-generated method stub
109 //关闭对话框
110 dialog.dismiss();
111 //结束Activity
112 GetIp.this.finish();
113 }
114 })
115 .create();//创建这个对话框
116 mDialog.show();//显示这个对话框
117 }
118
119 }
最后,修改AndroidManifest.xml文件,在里面添加2个权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
好了,不打开网络直接运行该程序,可以看到提示:
打开网络再运行该程序:
好了。
我原来也写过获ip的当不知道为什么老是获得的是ipv6。
后来我改成这样了:
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
|
// 设置IP地址 public String setIpAddr(WifiManager wifiManager) { // 判断wifi是否开启 String ipString = "" ; if (wifiManager.isWifiEnabled()) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); // 格式转换 ipString = (ipAddress & 0xFF ) + "." + ((ipAddress >> 8 ) & 0xFF ) + "." + ((ipAddress >> 16 ) & 0xFF ) + "." + ((ipAddress >> 24 ) & 0xFF ); } else { // 如果wifi没有开启的话,就获取3G的IP try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); // 遍历所有的网卡设备,一般移动设备上只有2张网卡,其中一张是环回网卡 for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); // 过滤掉环回网卡和IPv6 if (!inetAddress.isLoopbackAddress() && !(inetAddress instanceof Inet6Address)) { ipString = inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e( "TAG" , "getIpAddr()" + ex.toString()); } } return ipString; }
|
Android应用开发提高篇(1)-----获取本地IP的更多相关文章
- Android JNI开发提高篇
有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...
- Android应用开发提高篇(6)-----FaceDetector(人脸检测)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html 一.概述 初次看到FaceDetector这个类时,心里想:And ...
- Android应用开发提高篇(5)-----Camera使用
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部 ...
- Android应用开发提高篇(3)-----传感器(Sensor)编程
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/29/2373420.html 一.概述 Android支持的传感器种类越来越多了,这确实是一件可 ...
- Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html 一.概述 TextToSpeech,就是将文本内容转换成语音,在其 ...
- android 串口开发第二篇:利用jni实现android和串口通信
一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...
- Android应用开发基础篇(1)-----Button
Android应用开发基础篇(1)-----Button 一.概述 Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用 新建一个工程, ...
- Linux编程获取本地IP
#include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netine ...
随机推荐
- [LeetCode][Python]Largest Number
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/largest ...
- ocx控件获取使用App的窗口句柄
在CXxxCtrl文件中 HWND hAppWnd = NULL; if (m_pInPlaceSite != NULL) m_pInPlaceSite->GetWindow(&hApp ...
- schema文件中cube的事实表使用视图方法
在cube中可以使用查询结果或者视图来当做事实表,其中view的alias相当于表名,这个要和同一个cube中的level的表名对应,代码如下: <Cube name="YHZXZLF ...
- asp.net 向后台提交 html 代码段 包括 <> 标签
首先 在默认情况向标签类的东西是不会让你提交的 这是出于.net 的默认安全机制 我们要先在 <%@ page %> 里边加上 ValidateRequest="false&q ...
- jacksons转换大小写处理
import com.fasterxml.jackson.databind.ObjectMapper; 1.注意导入的objectMapper包一致 另:jackson的注解大全 https://gi ...
- USACO Section 4.2 Drainage Ditches(最大流)
最大流问题.ISAP算法.注意可能会有重边,不过我用的数据结构支持重边.距离d我直接初始化为0,也可以用BFS逆向找一次. -------------------------------------- ...
- 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承
在开始之前先来分析一下C++中的new运算符和operator new之间的关联. new:指我们在C++里通常用到的运算符,比如A* a = new A或者调用带参数的构造函数; 对于new来说, ...
- linux grep 指定字符串的正则表达式
cat all_uuid_log | grep "[a-z0-9]\{32\}"
- String字符串需要掌握的几个问题
一.两种定义方式的区别: String str = "hello"; 先在堆内存中查找是否已经有"hello",若有,将str指向已存在的它即可:若堆 ...
- Java的函数与函数重载
关于Java的函数与函数重载 关于Java的函数与函数重载 1. 函数 假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹.发射炮弹的动作都需要使用一段百行左右的程序代码,在每次发射炮弹的地方都要 ...