标签: android-networking

Android:如何知道IP地址是Wifi IP地址?

我想知道Android设备的IP地址是数据IP还是Wifi IP。


1) 设备首先连接到 3G,现在设备将被分配到网络 IP。
2) 后来设备连接到WIFI,现在设备将被分配到WIFI IP。
3)任何Android API可以让我们知道IP地址是Wifi IP地址还是网络IP?

在 2.3.5 中使用如下,一切都很好,但在 4.0.3 ICS 中出现了一些问题。

   /**
 * Is the IP Address a a Wifi Ip Address.
 * @param ipAddr
 * @return boolean
 */
public boolean isWifiIp(byte[] ipAddr){
    try{
        WifiManager mgr = (WifiManager)mCxt.getSystemService(Context.WIFI_SERVICE);
        int wifiIP = mgr.getConnectionInfo().getIpAddress();
        int reverseWifiIP = Integer.reverseBytes(wifiIP);  
        int byteArrayToInt = byteArrayToInt(ipAddr,0);

        if(byteArrayToInt == wifiIP || byteArrayToInt == reverseWifiIP)
            return true;
    }catch (Exception e) {
        Logger.d(TAG, e);
    }
    return false;
}


/**
 * Convert IP …
Run Code Online (Sandbox Code Playgroud)

java android android-networking

5
推荐指数
1
解决办法
1万
查看次数

为传入的网络连接保持 Android 唤醒?

我正在为 Android 设备编写 HTTP 服务器,通过 NanoHTTPD 实现。

我的一个目标是让设备即使在屏幕关闭的情况下也允许传入连接。

我开始时很小,有一个持久的通知,认为这将使我的应用程序保持在内存中并在后台运行。锁定设备后,我可以继续浏览它所提供的网页,只要我不让它待一分钟。一旦我这样做,它就完全停止响应。

我通过包含 CPU 部分唤醒锁来升级我的尝试,这没有任何区别。然后我添加了一个完整的 WifiLock 来保持收音机打开,最后,在绝望中,一个 MulticastLock(我想也许它可以让收音机监听连接)。尽管如此,在大约一分钟没有建立任何连接后,设备停止响应,即使有所有这些锁定。

我可以做些什么来保持设备监听传入连接?似乎通过定期请求击中设备使其保持清醒......我可以以某种方式以编程方式模拟这种行为吗?我想不出办法。

谢谢!

编辑:出于这个问题的目的,可以忽略电池消耗。

编辑:NanoHTTPD 也作为服务运行。

android android-networking android-wake-lock nanohttpd

5
推荐指数
1
解决办法
1106
查看次数

重置安卓手机网络信号?

我需要我的应用程序来重置设备的移动网络信号。这与切换飞行模式的效果相同,其中连接暂时丢失,重新连接时分配新的 IP 地址,状态栏中的 LTE/信号图标应消失,然后在重新连接时重新出现。我在 Play 商店上找到了一个应用程序,我在运行 Android 4.4.4 和 CyanogenMod 的手机上测试了该应用程序,它确实做到了这一点,但我不确定如何在我自己的应用程序中实现这一点。我认为这与CHANGE_NETWORK_STATE许可有关。我正在寻找文档或一些简单的示例代码来重置网络连接。

请注意,我并不是专门尝试切换飞行模式,而是按照上面链接的应用程序的方式重置移动数据,因为我已经测试过它确实可以工作,甚至不需要 root 权限。

android airplane android-networking

5
推荐指数
1
解决办法
1万
查看次数

android volley 中的 NoConnectionError

以下是我的代码。我第一次得到 com.android.volley.NoConnectionError: java.io.InterruptedIOException,第二次它工作正常。服务器响应也很好,服务器端没有错误。

RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

    JsonObjectRequest request = new JsonObjectRequest(URL, null,
            new Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject responseJsonObject) {
                    try {
                        if (responseJsonObject.has("user")
                                && !responseJsonObject
                                        .isNull("user")) {
                                user.jsonParser(responseJsonObject
                                    .getJSONObject("user"));
                        }
                    } catch (JSONException exception) {
                        Toast.makeText(context, "Error Occured",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            }, new ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    progressDialog.dismiss();
                    Log.d("Volley Error", volleyError.toString());
                    Toast.makeText(context, "Connectivity Error",
                            Toast.LENGTH_SHORT).show();
                }
            });

    queue.add(request);
    progressDialog.show();
    queue.start();
Run Code Online (Sandbox Code Playgroud)

android android-networking android-volley

5
推荐指数
1
解决办法
6519
查看次数

Android Volley 库:如何将图像发送到服务器?

嘿伙计们!

我有一个jpg image stored on my device我想要sent it to server(mywebsite.com/api.php)。我想使用volley library它是因为它是由 google 的官方 android 开发人员制作的,我认为他们会尽快将它添加到 sdk 中。

现在我正在使用以下代码将字符串发送到服务器:

 postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        // code here for response
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // code here for error response
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, …
Run Code Online (Sandbox Code Playgroud)

android jpeg android-networking android-volley

5
推荐指数
1
解决办法
2万
查看次数

尝试上传大文件改造 2 时管道损坏

尝试使用改造 2.0 上传大型视频文件(~140mb)时,我在上传之间遇到以下异常。小文件运行良好。

javax.net.ssl.SSLException: Write error: ssl=0xb924ef28: I/O error during system call, Broken pipe
at com.android.org.conscrypt.NativeCrypto.SSL_write(Native Method)
at          com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:771)
at okio.Okio$1.write(Okio.java:80)
at okio.AsyncTimeout$1.write(AsyncTimeout.java:155)
at okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
at okio.RealBufferedSink.write(RealBufferedSink.java:46)
at okhttp3.internal.http.Http1xStream$FixedLengthSink.write(Http1xStream.java:286)
at okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
at okio.RealBufferedSink.writeAll(RealBufferedSink.java:104)
at okhttp3.RequestBody$3.writeTo(RequestBody.java:118)
at okhttp3.MultipartBody.writeOrCountBytes(MultipartBody.java:171)
at okhttp3.MultipartBody.writeTo(MultipartBody.java:113)
at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:704)
at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:563)
at okhttp3.RealCall.getResponse(RealCall.java:241)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
Run Code Online (Sandbox Code Playgroud)

这是我创建多部分/表单数据的方式

File originalFile = new File(attachment.getFilePath());
    RequestBody requestFile
            = RequestBody.create(MediaType.parse("multipart/form-data"), originalFile);
    MultipartBody.Part body
            = MultipartBody.Part.createFormData("file", attachment.getUuid(), requestFile);
    Call<ResponseBody> call
            = FileAPIProvider.getService().upload(attachment.getUuid(),
                                        attachment.getUuid(),
                                        attachment.getMimeType(),
                                        body,
                                        attachment.getVirtualPath());
Run Code Online (Sandbox Code Playgroud)

改装适配器设置

        builder.connectTimeout(30, TimeUnit.SECONDS);
    builder.readTimeout(60, TimeUnit.MINUTES);
    builder.writeTimeout(60, TimeUnit.MINUTES);

    // …
Run Code Online (Sandbox Code Playgroud)

android multipartform-data android-networking retrofit retrofit2

5
推荐指数
0
解决办法
2035
查看次数

使用未弃用的方法以编程方式获取 Android 设备的 IPv4 和 IPv6,无论是在 Wifi 上还是在 Carier 的网络上

我遇到了一些关于在 Android 上以编程方式获取IPv4 和 IPv6 地址的讨论。这些其他问题和答案的问题是:

  • 这些问题/答案现在已经老了,因此经常被弃用。我正在寻找一种以非弃用方式完成它的方法(例如,不推荐使用 InetAddressUtils,其他方式也是如此)。
  • 我想知道如何在 Wifi 或运营商网络同时获取IPv4 和 IPv6地址。

有没有人可以告诉我如何在没有冗长方法的情况下以简短整洁的方式完成它(如果可能的话)?

android ipv4 ipv6 android-networking

5
推荐指数
1
解决办法
5467
查看次数

当wifi打开时,仅通过Android手机上的移动数据发送数据

即使 wifi 打开并连接到互联网,是否也可以通过移动数据以编程方式路由请求?

我的应用程序需要调用运营商提供的服务,该服务只能通过移动数据使用,我认为要求关闭 wifi 对用户不友好。

android android-networking android-wifi

5
推荐指数
1
解决办法
1150
查看次数

获取活动网络的接口名称 (API 21)

我需要wlan0在 API 21 中获取活动网络的接口名称(例如)。

在 API 23 中,我可以:

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
Network activeNetwork = connectivityManager.getActiveNetwork();
if (activeNetwork != null)
{
    LinkProperties linkProperties = connectivityManager.getLinkProperties(activeNetwork);
    String name = linkProperties.getInterfaceName();
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是ConnectivityManager.getActiveNetwork(),仅适用于 API 23 及更高版本。

是否有可接受的与 API 21 兼容的解决方案?

我想出了以下遍历所有网络并进行比较的方法NetworkInfo.toString()(因为按引用或值进行比较不起作用)。它似乎有效,但也感觉像是一个巨大的黑客:

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null)
{
    Network[] networks = connectivityManager.getAllNetworks();
    for (Network network : networks)
    {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
        if (networkInfo.toString().equals(activeNetworkInfo.toString()))
        {
            LinkProperties linkProperties …
Run Code Online (Sandbox Code Playgroud)

android android-networking

5
推荐指数
0
解决办法
777
查看次数

在 Android Q 上结合 WiFi 说明符和建议 API

我正在构建一个应用程序,其中与第二个设备的连接是本质。因此,我使用了WifiNetworkSpecifier API。但是,一旦用户离开并返回 Wi-Fi 边界,应用程序必须能够自动重新连接到目标网络。因此,我使用了WifiNetworkSuggestion API。但是,我在那里遇到了几个问题:

  1. 使用说明符 API 连接到 SSID 并确认建议 API 生成的推送通知后,建议 API 似乎不起作用,直到我手动断开与 SSID 的连接(取消注册先前分配给说明符请求的网络回调)或杀死应用程序。
  2. 如果用户之前使用 OS Wi-Fi 管理器(例如热点)连接到的外围存在另一个网络,Android 将优先考虑该网络,因此我的应用程序的建议 API 永远不会自动重新连接到想要的和可访问的 SSID。

到目前为止,根据我的经验和理解(这可能是错误的),似乎我们必须手动取消注册先前分配给说明符请求的网络回调,或者终止应用程序,然后让建议 API 完成它的工作,直到它可以工作适当地。如果边界中存在其他网络(用户之前使用 OS Wi-Fi 管理器连接到该网络),这可能会出现问题。在这种情况下,我们永远不会自动重新连接到应用程序定义的 SSID,建议 API 也永远不会工作。

问题是:如何将这两个 API 结合起来,以便能够连接到 SSID,但又可以自动重新连接,而不会进行手动断开用户连接或杀死应用程序等丑陋的黑客攻击,这也不能给我们任何保证?

在我看来,这个使用新网络 API 的全新实现做得不好,它给开发人员带来了很多问题和限制,或者至少它的文档很差。

这是用于发出请求的代码。请注意,我连接的设备没有实际的互联网访问权限,它只是用作 p2p 网络。

@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(wifiCredentials: WifiCredentials, onUnavailable: () -> Unit) {

    val request = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(createWifiNetworkSpecifier(wifiCredentials))
        .build()

    networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            connectivityManager.bindProcessToNetwork(network)
        }

        override …
Run Code Online (Sandbox Code Playgroud)

android internet-connection android-networking android-wifi android-10.0

5
推荐指数
1
解决办法
768
查看次数