Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

这篇具有很好参考价值的文章主要介绍了Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

运行有问题或需要源码请点赞关注收藏后评论区留言~~~

一、GET方式调用HTTP接口

Android开发采用Java作为编程语言,也就沿用了Java的HTTP连接工具HttpURLConnection,不管是访问HTTP接口还是上传或下载文件都是用它来实现。它有几个关键点

1:HttpURLConnection默认采取国际通行的UTF-8编码,中文用GBK编码

2:多数时候服务器返回的报文采用明文传输,但有时为了提高传输效率,服务器会先压缩应答报文,再把压缩后的数据送给调用方,这样耗费空间小,降低流量占用

3:小心返回报文超长的情况

访问HTTP接口要求APP事先申请网络权限,也就是在AndroidManifest.xml内部添加以下的网络权限配置

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

</uses-permission>

 同样开启手机的定位权限功能 代码如下

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">

    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">

    </uses-permission>

定位工具Location包含了丰富的位置信息 部分方法如下

1:getProvider 获取定位类型 主要由网络定位和GPS定位

2:getTime 获取定位时间

3:getLongitude 获取经度

4:getLatitude 获取纬度

5:getAltitude 获取高度

6:getAccuracy 获取定位精度

如果想把经纬度换算为详细地址的文字描述,就要调用地图服务商的地址查询接口,本次案例选用天地图的查询服务  效果如下

Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

模拟机上定位不了 建议连接真机测试 

 Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

 代码如下

Java类

package com.example.chapter14;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.example.chapter14.task.GetAddressTask;
import com.example.chapter14.task.GetAddressTask.OnAddressListener;
import com.example.chapter14.util.DateUtil;
import com.example.chapter14.util.SwitchUtil;

@SuppressLint("DefaultLocale")
public class HttpGetActivity extends AppCompatActivity implements OnAddressListener {
    private final static String TAG = "HttpGetActivity";
    private TextView tv_location;
    private Location mLocation; // 定位信息

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http_request);
        tv_location = findViewById(R.id.tv_location);
        // 检查定位功能是否打开,若未打开则跳到系统的定位功能设置页面
        SwitchUtil.checkGpsIsOpen(this, "需要打开定位功能才能查看定位结果信息");
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 检查当前设备是否已经开启了定位功能
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "请授予定位权限并开启定位功能", Toast.LENGTH_SHORT).show();
            return;
        }
        // 从系统服务中获取定位管理器
        LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 获取最后一次成功定位的位置信息(network表示网络定位方式)
        Location location = mgr.getLastKnownLocation("network");
        getLocationText(location); // 获取定位结果文本
        // 获取最后一次成功定位的位置信息(gps表示卫星定位方式)
        location = mgr.getLastKnownLocation("gps");
        getLocationText(location); // 获取定位结果文本
    }

    // 获取定位结果文本
    private void getLocationText(Location location) {
        if (location != null) {
            mLocation = location;
            refreshLocationInfo(""); // 刷新定位信息
            GetAddressTask task = new GetAddressTask(); // 创建一个详细地址查询的异步任务
            task.setOnAddressListener(this); // 设置详细地址查询的监听器
            task.execute(location); // 把详细地址查询任务加入到处理队列
        }
    }

    // 在找到详细地址后触发
    @Override
    public void onFindAddress(String address) {
        refreshLocationInfo(address); // 刷新定位信息
    }

    // 刷新定位信息
    private void refreshLocationInfo(String address) {
        String desc = String.format("定位类型=%s\n定位对象信息如下: " +
                        "\n\t其中时间:%s" + "\n\t其中经度:%f,纬度:%f" +
                        "\n\t其中高度:%d米,精度:%d米" + "\n\t其中地址:%s",
                mLocation.getProvider(), DateUtil.formatDate(mLocation.getTime()),
                mLocation.getLongitude(), mLocation.getLatitude(),
                Math.round(mLocation.getAltitude()), Math.round(mLocation.getAccuracy()), address);
        tv_location.setText(desc);
    }

}

任务类

package com.example.chapter14.task;

import android.location.Location;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;

import com.example.chapter14.constant.UrlConstant;
import com.example.chapter14.util.HttpUtil;

import org.json.JSONException;
import org.json.JSONObject;

// 根据经纬度获取详细地址的异步任务
public class GetAddressTask extends AsyncTask<Location, Void, String> {
    private final static String TAG = "GetAddressTask";
//    public GetAddressTask() {
//        super();
//    }

    // 线程正在后台处理
    protected String doInBackground(Location... params) {
        Location location = params[0];
        // 把经度和纬度代入到URL地址。天地图的地址查询url在UrlConstant.java中定义
        String url = String.format(UrlConstant.GET_ADDRESS_URL,
                location.getLongitude(), location.getLatitude());
        Log.d(TAG, "url = " + url);
        String resp = HttpUtil.get(url, null); // 发送HTTP请求信息,并获得HTTP应答内容
        Log.d(TAG, "resp = " + resp);
        String address = "未知";
        // 下面从JSON串中解析formatted_address字段获得详细地址描述
        if (!TextUtils.isEmpty(resp)) {
            try {
                JSONObject obj = new JSONObject(resp);
                JSONObject result = obj.getJSONObject("result");
                address = result.getString("formatted_address");
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        Log.d(TAG, "address = " + address);
        return address; // 返回HTTP应答内容中的详细地址
    }

    // 线程已经完成处理
    protected void onPostExecute(String address) {
        mListener.onFindAddress(address); // HTTP调用完毕,触发监听器的找到地址事件
    }

    private OnAddressListener mListener; // 声明一个查询详细地址的监听器对象
    // 设置查询详细地址的监听器
    public void setOnAddressListener(OnAddressListener listener) {
        mListener = listener;
    }

    // 定义一个查询详细地址的监听器接口
    public interface OnAddressListener {
        void onFindAddress(String address);
    }

}

日期类

package com.example.chapter14.util;

import android.annotation.SuppressLint;
import android.text.TextUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

@SuppressLint("SimpleDateFormat")
public class DateUtil {
    // 获取当前的日期时间
    public static String getNowDateTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(new Date());
    }

    // 获取当前的时间
    public static String getNowTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        return sdf.format(new Date());
    }

    // 获取当前的时间(精确到毫秒)
    public static String getNowTimeDetail() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
        return sdf.format(new Date());
    }

    // 获取指定格式的日期时间
    public static String getNowDateTime(String formatStr) {
        String format = formatStr;
        if (TextUtils.isEmpty(format)) {
            format = "yyyyMMddHHmmss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date());
    }

    public static String formatDate(long time) {
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    // 重新格式化日期字符串
    public static String convertDateString(String strTime) {
        String newTime = strTime;
        try {
            SimpleDateFormat oldFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date = oldFormat.parse(strTime);
            SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            newTime = newFormat.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newTime;
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <TextView
        android:id="@+id/tv_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂未获取到定位对象"
        android:textColor="@color/black"
        android:textSize="17sp" />

</LinearLayout>

创作不易 觉得有帮助请点赞 关注收藏~~~文章来源地址https://www.toymoban.com/news/detail-446099.html

到了这里,关于Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android studio 使用C/C++开发app

    Android studio 使用C/C++开发app

    一、在新建项目中选择Native C++,然后下一步 二、名字跟保存位置自定义,语言选择Java,SDK根据app安装的平台选择对应的版本,选好后下一步  三、C++ Standard默认选择就可以,点击完成  四、加载完成后,把项目标题Android换成项目  换完后的列表    C/C++的代码在cpp文件夹中

    2024年02月12日
    浏览(14)
  • Qt开发-TCP/IP网络通信(以及文件传输)

    Qt开发-TCP/IP网络通信(以及文件传输)

    TCP/IP通信(即SOCKET通信)是通过网线将 服务器Server端 和 客户机Client端 进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。 关于TCP/IP协议可详看:TCP/IP协议详解 - 知乎 (zhihu.com) 总的来说,TCP/IP通讯有两个部分

    2024年02月10日
    浏览(10)
  • C# 使用UDP进行网络通信

    C# 使用UDP进行网络通信

           在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即

    2024年02月12日
    浏览(10)
  • 安卓大作业:使用Android Studio开发天气预报APP(使用sqlite数据库)

    安卓大作业:使用Android Studio开发天气预报APP(使用sqlite数据库)

    今天我来分享一下如何使用Android Studio开发一个天气预报APP。在文中,我们将使用第三方接口获取实时天气数据,并显示在APP界面上。 首先,打开Android Studio并创建一个新的项目。在创建新项目时,我们需要设置项目名称、包名和支持的最低API级别。 为了获取实时天气数据,

    2024年02月08日
    浏览(12)
  • 使用 python socket 实现UDP/TCP网络通信

    使用 python socket 实现UDP/TCP网络通信

    目录 目录 1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端        socket(简称:套接字),是支持TCP和UDP(网络传输方式

    2023年04月10日
    浏览(9)
  • RPC分布式网络通信框架(一)—— protobuf的使用

    RPC分布式网络通信框架(一)—— protobuf的使用

    常见序列化和反序列化协议有XML、JSON、protobuf,相比于其他protobuf更有优势: 1、protobuf是二进制存储的,xml和json都是文本存储的。故protobuf占用带宽较低 2、protobuf不需要存储额外的信息。 json如何存储数据?键值对。例:Name:”zhang san”, pwd: “12345”。 protobuf存储数据的方式

    2024年02月16日
    浏览(16)
  • 网络通信(18)-C#TcpClient 和 TcpListener的使用实例

    网络通信(18)-C#TcpClient 和 TcpListener的使用实例

    本文演示C#TcpClient 和 TcpListener的使用实例,掌握基本用法。 目录 TcpListener服务器 客户端TcpClient 界面 UI代码

    2024年01月24日
    浏览(11)
  • Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)

    Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 对于手机拍照的App开发而言,有两种实现方式 1:通过 camera工具联合表面视图SurfaceView自行规划编码细节 2:借助系统相机自动拍照,考虑到多数场景对图片并没有特殊要求,所以使用系统相机更加方便快捷  效果如下 点

    2024年02月11日
    浏览(8)
  • 【Shell 命令集合 网络通讯 】Linux 串口通信 minicom命令 使用指南

    【Shell 命令集合 网络通讯 】Linux 串口通信 minicom命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 minicom是一个在Linux中用于串口通信的命令行工具。它提供了一个交互式的终端界面,可以通过串口与其他设备进行通信,如调试串口设备、路由器、嵌入式系统等。 使用minicom命令,可以实现以下功能: 串口通信:minicom可以通过串口与其

    2024年02月08日
    浏览(12)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包