当前位置: 首页 > article >正文

Android App获取自己的公网IP地址

核心原理

可以通过给

https://ipinfo.io/ip

发送一个请求,这个会解析请求头里的数据,并将其ip解析出来返回到body数据里,这样前端页面拿到这个数据显示出来就可以知道自己设备联网的公网ip地址了。

Android客户端代码

引入okhttp的依赖

    implementation 'com.squareup.okhttp3:okhttp:4.9.1'

Java代码


import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    private TextView ipTextView;
    private Handler mainHandler;

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

        ipTextView = findViewById(R.id.ipTextView);

        // 创建一个主线程的 Handler,接收并处理子线程发送的消息
        mainHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                // 处理消息
                if (msg.what == 1) {
                    String publicIp = (String) msg.obj; // 获取传递过来的公网 IP
                    ipTextView.setText("Public IP: " + publicIp); // 更新 UI
                }
            }
        };

        findViewById(R.id.btnGetPublicIP).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 启动子线程进行网络请求
                new Thread(new Runnable() {
                    @SuppressLint("SetTextI18n")
                    @Override
                    public void run() {
                        String ip = getIp();
                        if (!TextUtils.isEmpty(ip)) {
                            // 子线程发送消息到主线程
                            Message msg = mainHandler.obtainMessage();
                            msg.what = 1; // 消息标识
                            msg.obj = ip; // 传递结果
                            mainHandler.sendMessage(msg); // 发送消息到主线程
                        }
                    }
                }).start();
            }
        });
    }



    public String getIp() {
        String ip = "";
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://ipinfo.io/ip")
                .build();
        try {
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    String requestBody = response.body().string();
                    Log.i("MainActivity", "requestBody length is " + requestBody.length());
                    ip = requestBody;
                    return ip;
                }
            }
        } catch (Exception e) {
            Log.e("MainActivity", "ipAddress is null exception is " + e);
        }
        return ip;
    }
}

引入布局文件

<?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:padding="16dp">

    <Button
        android:id="@+id/btnGetPublicIP"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get Public IP"
        android:layout_alignParentTop="true"/>

    <TextView
        android:id="@+id/ipTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Public IP will be shown here"
        android:layout_below="@id/btnGetPublicIP"
        android:layout_marginTop="16dp"/>
</RelativeLayout>

运行结果


http://www.kler.cn/a/404145.html

相关文章:

  • Spring Cloud Stream实现数据流处理
  • 索贝融媒体 Sc-TaskMonitoring/rest/task/search SQL注入漏洞复现
  • AI Prompt Engineering
  • UE5 DownloadImage加载jpg失败的解决方法
  • Redis 实现高性能计数器
  • NIO 与传统 IO:深入理解与应用场景
  • Elasticsearch面试内容整理-实践与应用场景
  • ComfyUI绘画|Stable Diffusion原理的简易讲解
  • 2024年亚太地区数学建模C题完整思路
  • “闲置经济”成新消费趋势,万物新生长期成长性如何?
  • 早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现
  • B树的简单实现
  • DAY4 网络编程(广播和多线程并发)
  • shell(6)之for循环
  • React可以做全栈开发吗
  • atob()为啥明明表示base64toASCII却叫atob?(2)
  • AIX下crs-5005 ip address is aready in use in the network的解决办法
  • Apple Vision Pro开发003-PolySpatial2.0新建项目
  • Ubuntu24.04——软件包系统已损坏
  • 关于学习小波分析
  • Xilinx IP核(3)XADC IP核
  • AcWing 842. 排列数字(周四)
  • translation1
  • 【Maven】IDEA创建Maven项目 Maven配置
  • ssm框架-spring-spring声明式事务
  • Spring Boot实验室管理系统:高效科研管理解决方案