You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin+Volley开发的Android App无法调用Django后端接口求助

Android模拟器调用本地Django API请求失败解决方案

问题核心排查点

模拟器环境下直接用127.0.0.1访问本地服务会指向模拟器自身而非宿主电脑;同时URL格式、Django服务绑定配置、App权限都可能导致请求无法到达服务器。


具体解决步骤

1. 修正API访问地址

  • Android模拟器中访问宿主电脑的本地服务,必须使用10.0.2.2(官方默认的宿主机映射地址),而非127.0.0.1或局域网IP(除非Django明确绑定了该IP)
  • 修复URL中的双斜杠问题:将http://127.0.0.1:8000//index改为http://10.0.2.2:8000/index

2. 配置Django允许外部访问

  • 启动Django时,绑定到所有网卡地址,确保模拟器能访问:
    python manage.py runserver 0.0.0.0:8000
    
  • 修改Django项目的settings.py,添加允许访问的主机:
    ALLOWED_HOSTS = ['10.0.2.2', 'localhost', '192.168.1.2'] # 按需添加你的局域网IP
    

3. 添加App网络权限

在AndroidManifest.xml中声明互联网权限:

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

4. 增强错误调试

修改Volley的错误监听,打印详细错误信息,便于定位问题:

Response.ErrorListener { error ->
    val errorMsg = buildString {
        append("请求失败: ${error.message ?: "未知错误"}")
        error.networkResponse?.let {
            append("\n状态码: ${it.statusCode}")
        }
    }
    textView.text = errorMsg
    // 查看Logcat的VolleyDebug标签获取完整堆栈
    Log.e("VolleyDebug", "请求出错", error)
}

5. 验证基础连通性

在模拟器自带浏览器中访问http://10.0.2.2:8000/index,如果能正常显示响应,说明网络和Django服务正常,问题出在App代码配置。


修正后的完整核心代码

import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView = findViewById<TextView>(R.id.text)
        val queue: RequestQueue = Volley.newRequestQueue(this)
        val url = "http://10.0.2.2:8000/index"

        val stringRequest = StringRequest(
            Request.Method.GET, url,
            { response ->
                textView.text = "Response is: ${response.substring(0, 500)}"
            },
            { error ->
                val errorMsg = buildString {
                    append("请求失败: ${error.message ?: "未知错误"}")
                    error.networkResponse?.let {
                        append("\n状态码: ${it.statusCode}")
                    }
                }
                textView.text = errorMsg
                Log.e("VolleyDebug", "请求出错", error)
            })

        queue.add(stringRequest)
    }
}

内容的提问来源于stack exchange,提问作者CodeR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:15:29