Android实现与PHP后端的交互(数据传输,文件传输)(超详细/附源码)

这篇具有很好参考价值的文章主要介绍了Android实现与PHP后端的交互(数据传输,文件传输)(超详细/附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为方便大家浏览,源码先行奉上
github源码链接 https://github.com/Recycle1/Android-connect-PHP
csdn源码链接 https://download.csdn.net/download/weixin_52263647/87751491

在Android开发中,经常涉及与服务器端交互的过程,在现在的APP制作中,经常利用互联网通信,从云端获取图片,数据等信息,本篇文章将详细介绍Android与PHP后端进行交互的过程,即利用http进行通信的过程。

那熟悉PHP开发的我们都会知道PHP页面的传参方式有Get和Post,利用此原理我们即可实现Android端与PHP端的交互,Android端进行带参访问即进行Get方法传参,对于大规模的数据如文件的传输,利用Post方法,在Android端设置好相应的参数,进行大规模数据的传输。在之后的讲解中,我们将分情况进行演示。

在这篇文章中,我们需要准备的东西有:

  • Android手机,这里我调试使用的是真机,测试所用的安卓版本为Android 10,当前普遍使用的Android 12版本可能会出现不适配的情况,比如文件读取和权限方面,这个只需稍加调试即可解决。
  • 云服务器,这里我租用了阿里云的云服务器,并部署了SSL证书,(当然,如果只是android信息交互也可以不使用SSL证书)

那么接下来,我将分情况介绍如何进行Android与PHP的交互。

一 Android端

权限设置

对于互联网连接方面和文件读取方面,需要给予一定的权限,在manifest中设置

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

文件读取与写入(尤其要看一下哦!!!)

本地文件读取与写入,同时需要在activity中动态给予权限。

//初始化权限
void init_permission(){
	if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
    }
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
}

同时,由于在本篇文章中要在手机内存中写入测试的文件,因此需要在Mainfest文件中的Application标签下设置如下权限,负责无法正常读取路径和写入文件。

android:requestLegacyExternalStorage="true"

http网络连接设置(也尤其要看一下哦!!!)

在本篇文章中,由于我的云服务器部署了SSL证书和域名,因此可以利用https进行访问,但是如果没有SSL证书和域名,我们要利用IP地址进行访问,那需要在Mainfest文件中的Application标签下设置如下权限,负责无法正常连接到服务器。

android:usesCleartextTraffic="true"

1. 单条数据传输(Get方法)

单条数据的传输,我们在Android端传入字符串,服务器端也会返回字符串,利用http建立连接。

//主要用于传输单条数据,如字符串等,同时,PHP端也返回单条数据
public static String singleData(String path) throws Exception {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if (conn.getResponseCode() == 200) {
            InputStream inputStream = conn.getInputStream();
            byte[] data = StreamTool.read(inputStream);
            String result = new String(data);
            return result;
        }
        return "failed";
}

下面的代码是上面过程中从流中读取数据的内容。

public static class StreamTool {
        //从流中读取数据
        public static byte[] read(InputStream inStream) throws Exception{
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len = inStream.read(buffer)) != -1)
            {
                outStream.write(buffer,0,len);
            }
            inStream.close();
            return outStream.toByteArray();
        }
}

2. 多条多元数据传输(Get方法)

对于多元的数据类型,我们可以采用json数组的方式进行传输,首先定义一个包含我们需要的数据类型的类,这里我设置它包含三种不同的属性,a1,a2,a3。

public class MultipleResult {

    //类中包含多种不同类型的属性
    String a1;
    int a2;
    double a3;

    public MultipleResult(String a1, int a2, double a3) {
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
    }

}

在获取时,我们沿用单条数据传输的思路,只不过我们需要将获取到的json数组转换为Arraylist进行存储,这里我设置了一个参数n,因为通常情况下,我们都是在Android获取参数作为关键字到云端数据库中进行查询,然后返回查询的结果,比如我们Android端获取学生的学号,在云端数据库中查询并且返回学生的信息。

//用于获取多种复杂类型的数据
public static ArrayList<MultipleResult> multipleData(String n) throws Exception {
        ArrayList<MultipleResult> list=new ArrayList<>();
        String path="http://101.201.109.91/Connect_Android/get_multiple_data.php?n="+n;
        HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
        InputStream json = conn.getInputStream();
        byte[] data = StreamTool.read(json);
        String json_str = new String(data);
        JSONArray jsonArray = new JSONArray(json_str);
        for(int i = 0; i < jsonArray.length() ; i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String a1=jsonObject.getString("a1");
            int a2=jsonObject.getInt("a2");
            double a3=jsonObject.getDouble("a3");
            list.add(new MultipleResult(a1,a2,a3));
        }
        return list;
}

3. 文件传输(Post方法)

这里我直接沿用了另一位博主的文章,链接暂时找不到了,方式是设置Post的相关参数,从本地的存储地址传到云端的存储地址。我们需要在函数中写入的参数有本地的存储路径,服务器端的存储路径,和文件名称(这里的文件名称可以是随机定义的,是在服务器端最终显示的文件名称,可以与本地存储路径名称不同)

public static void uploadFile(String path, String url_path, String name) {
        String end = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        try
        {
            URL url = new URL(url_path);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
          /* Output to the connection. Default is false,
             set to true because post method must write something to the connection */
            con.setDoOutput(true);
            /* Read from the connection. Default is true.*/
            con.setDoInput(true);
            /* Post cannot use caches */
            con.setUseCaches(false);
            /* Set the post method. Default is GET*/
            con.setRequestMethod("POST");
            /* 设置请求属性 */
            con.setRequestProperty("Connection", "Keep-Alive");
            con.setRequestProperty("Charset", "UTF-8");
            con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            /*设置StrictMode 否则HTTPURLConnection连接失败,因为这是在主进程中进行网络连接*/
            // StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
            /* 设置DataOutputStream,getOutputStream中默认调用connect()*/
            DataOutputStream ds = new DataOutputStream(con.getOutputStream());  //output to the connection
            ds.writeBytes(twoHyphens + boundary + end);
            ds.writeBytes("Content-Disposition: form-data; " +
                    "name=\"file\";filename=\"" +
                    name+"\"" + end);
            ds.writeBytes(end);
            /* 取得文件的FileInputStream */
            FileInputStream fStream = new FileInputStream(path);
            /* 设置每次写入8192bytes */
            int bufferSize = 8192;
            byte[] buffer = new byte[bufferSize];   //8k
            int length = -1;
            /* 从文件读取数据至缓冲区 */
            while ((length = fStream.read(buffer)) != -1)
            {
                /* 将资料写入DataOutputStream中 */
                ds.write(buffer, 0, length);
            }
            ds.writeBytes(end);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
            /* 关闭流,写入的东西自动生成Http正文*/
            fStream.close();
            /* 关闭DataOutputStream */
            ds.close();
            /* 从返回的输入流读取响应信息 */
            InputStream is = con.getInputStream();  //input from the connection 正式建立HTTP连接
            int ch;
            StringBuffer b = new StringBuffer();
            while ((ch = is.read()) != -1)
            {
                b.append((char) ch);
            }
            /* 显示网页响应内容 */
            System.out.println(b.toString().trim());
            //Toast.makeText(MainActivity.this, b.toString().trim(), Toast.LENGTH_SHORT).show();//Post成功
        } catch (Exception e)
        {
            /* 显示异常信息 */
            System.out.println("fail"+e);
            //Toast.makeText(MainActivity.this, "Fail:" + e, Toast.LENGTH_SHORT).show();//Post失败
        }
}

在Activity中的进行调用使用

在xml文件中,我们设置了三个按钮,和一个文本,分别进行单条数据传输,多元数据传输,以及文件传输的显示。

在activity中,我们将整个的方法整合为一个WebTool工具类,利用这个工具类调用上述的方法,同时需要注意的是,网络连接不能再主线程中进行,因此需要开辟一个新的线程进行调用,同时,对于前端控件的调用不能在分支线程中进行,因此最后的结果显示部分,我们用到了handler实现分支线程与主线程之间的通信,最终实现结果在TextView中显示。

1. 单条数据传输调用

//在新线程中获取数据,通过handler判断是否获取到数据
//n为向PHP传输的数据
String n="本地测试数据";
result=WebTool.singleData("https://www.recycle11.top/Connect_Android/get_single_data.php?n="+n);

2. 多条多元数据调用

//n为测试数据
result_list=WebTool.multipleData("本地测试数据");

3. 文件传输

WebTool.uploadFile(test_file_path(),"https://www.recycle11.top/Connect_Android/upload.php","test.txt");

本地文件处理

本地文件处理借鉴了另一篇博文,由于没有测试过Android 12版本,因此文件权限方面一定要处理好,否则无法获取,写入文件。
博文链接:本地文件的创建

在本地我们将文件夹创建,文件创建放入一个工具类FileUtil中,进行处理,我们将写入一个文件存入手机内存中,并获得它的路径。

String test_file_path(){
        File fileDir=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Connect_web_test");
        String filename="test.txt";

        //创建文件夹及文件
        FileUtil.createFileDir(fileDir);
        FileUtil.createFile(fileDir.getAbsolutePath(),filename);

        //写入文件信息
        FileOutputStream fos = null;
        try {

            fos = new FileOutputStream(fileDir.getAbsolutePath()+"/"+filename);
            String content="本地测试数据";
            fos.write(content.getBytes());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                //保证即使出现异常,fos也可以正常关闭
                fos.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }

        return fileDir.getAbsolutePath()+"/"+filename;
}

二 PHP服务器端

在服务器端我们创建了如下的一些文件,设置了三个php文件接收并回传信息,Android_File文件夹存储Android端传入的文件。
用php开发android系统usb通信,android,php,https,安卓,http
单条数据传输

<?php
    if(is_array($_GET)&&count($_GET)>0){
        if(isset($_GET['n'])){
            $n=$_GET['n'];
        }
    }
    echo "网络数据内容"
?>

多条多元数据传输

<?php
    if(is_array($_GET)&&count($_GET)>0){
        if(isset($_GET['n'])){
            $n=$_GET['n'];
        }
    }
    //根据传过来的数据$n可作为关键字,查询数据库的信息,这里就不演示数据库交互过程了
    $content=array();
    $content[0]=array("a1"=>"网络测试数据1","a2"=>1,"a3"=>1.5);
    $content[1]=array("a1"=>"网络测试数据2","a2"=>2,"a3"=>2.5);
	echo json_encode($content);
?>

文件传输

<?php
	$target_path  = "./Android_File/";//接收文件目录
	$target_path = $target_path . basename( $_FILES['file']['name']);
	if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
   		echo "The file ".  basename( $_FILES['file']['name']). " has been uploaded";
	}
	else{
   		echo "There was an error uploading the file, please try again!" . $_FILES['file']['error'];
	}
?>

最后我们在手机上进行测试,出现如下效果就说明数据传输成功了。

单条数据传输

用php开发android系统usb通信,android,php,https,安卓,http

多条多元数据传输

用php开发android系统usb通信,android,php,https,安卓,http

文件传输

用php开发android系统usb通信,android,php,https,安卓,http

PS:博主在测试完成后,将服务器端的代码删除了,因此利用本demo是无法访问博主服务器的,也无法直接运行,需要大家连接自己的服务器哦。文章来源地址https://www.toymoban.com/news/detail-805656.html

到了这里,关于Android实现与PHP后端的交互(数据传输,文件传输)(超详细/附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ssm/php/node/python基于物联网的医疗数据采集传输系统

    本系统 (程序+源码) 带文档lw万字以上    文末可领取本课题的JAVA源码参考 选题背景: 随着物联网技术的飞速发展,其在医疗领域的应用也日益广泛。物联网技术通过将传感器、智能设备与网络连接起来,实现了数据的实时采集、传输和处理,极大地丰富了医疗服务的手

    2024年02月19日
    浏览(27)
  • Flutter 调用原生(Android)方法以及数据传输

    flutter是一个UI框架,有许多方法和功能只能靠原生自己来调用,但是我们怎么通过flutter去间接调用呢?官方给出了两种方法 在平台通道之间进行消息传递: 注:消息和响应以异步的形式进行传递,以确保用户界面能够保持响应。 flutter端: 然后找到android工程,打开MainActi

    2024年02月10日
    浏览(38)
  • Android WiFi P2P数据传输

    WiFi P2P是指通过WiFi直接连接两台设备之间的无线点对点通信,不需要通过路由器或者互联网。这种技术被广泛应用于移动设备之间的文件共享、游戏联机、音乐播放等应用场景中。 WiFi P2P的优点在于可以在没有网络的情况下建立设备之间的连接,同时具有高速和低延迟的特点

    2024年02月07日
    浏览(31)
  • Android 数据SM4传输加解密

    第一:场景介绍   甲方要求,数据在传输过程中要加密。 第二:选择加解密方式: 这里面Android 和服务端都是选择SM4 第三:实现方式 1:服务端采用SpringBoot,在pom.xml 文件下添加依赖 2:在Android 端同样添加依赖,在module 下面build.gradle 3:服务端SM4工具类 4:Android SM4 工具类,

    2024年02月13日
    浏览(39)
  • Vue+Springboot前后端完整使用国密算法SM2双公私钥对数据加密传输交互完整解决方案

    Vue+Springboot 前后端完整使⽤国密算法SM2双公私钥对数据加密传输交互完整解决⽅案项⽬,特别是企事业单位的项⽬,第三方测试公司做安全测试时,常常要求使用国密算法,因涉及服务端和客户端的交互,传递关键数据时要求使用SM2非对称加密。 引入相关依赖 这里我使用的

    2024年01月23日
    浏览(37)
  • 【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

    目录 一、数据传输 1.1 APP和驱动  1.2 驱动和硬件 二、APP使用驱动的4种方式 2.1 非阻塞(查询) 2.2 阻塞(休眠+唤醒) 2.3 POLL(休眠+唤醒+超时时间) 2.3.1 POLL机制流程 2.3.2 POLL执行流程 2.3.3 POLL应用和驱动编程  2.4 异步通知 2.4.1 异步通知流程 2.4.1 异步通知应用和驱动编程

    2024年02月06日
    浏览(42)
  • 如何实现网络数据传输

    目录 前言 1.理解源IP地址和目的IP地址 2.理解端口号 2.1端口号与进程pid的关系 2.2源端口号和目的端口号 3.协议 3.1TCP协议 3.2认识UDP协议 4.网络字节序 5.socket编程接口 总结         在上一篇文章网络框架中给大家对网络的整体进行了一个宏观的介绍,这篇文章中我们进一步来

    2024年02月13日
    浏览(35)
  • FPGA(Verilog)实现uart传输协议传输数据(含仿真)

    目录 实现功能: 1.接收uart串行数据,输出并行数据(1byte)。 2.输入并行数据(1byte),输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 模块封装-port设置 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数据和其有效标志。 仿真结果: 2.uart发送模块:接收

    2024年04月16日
    浏览(34)
  • 手机如何实现边充电边传输数据?

    日常我们在手机连接电脑或者U盘传输数据的时候,虽然都是传输数据,但是主从关系是不同的,在手机连接电脑的时候可以同时给手机充电,而连接U盘的时候是手机提供电力给U盘,造成这种区别到底是由什么控制呢?   首先我们要知道数据和供电是两个角色,数据和供电都

    2024年02月09日
    浏览(34)
  • 物联网安全:实现数据传输安全的关键技术

    物联网(Internet of Things, IoT)是指通过互联网将物体和日常生活中的各种设备(如传感器、电子标签、智能手机、电子产品等)互联互通,实现人机交互、物物交互和人物交互的大规模网络。随着物联网技术的发展,物联网设备的数量日益增加,这些设备在各个行业中扮演着越来越

    2024年02月19日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包