标签: android-networking

ConnectivityManager.requestNetwork() 未按预期工作

我正在尝试暂时强制设备使用移动数据。我在用ConnectivityManager.requestNetwork()

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

    connectivityManager.requestNetwork(request.build(), newRequestTransportCallback(connectivityManager),
            (int) TimeUnit.SECONDS.toMillis(10));
Run Code Online (Sandbox Code Playgroud)

哪里newRequestTransportCallback()的回报,

new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                Log.d(TAG,"Network available: " + network + ", binding...");
                if (cm.bindProcessToNetwork(network)) {
                    Log.d(TAG,"Bind successful to network: " + network);
                } else {
                    Log.w(TAG,"Bind failed to network: " + network);
                }
            }

            @Override
            public void onUnavailable() {
                Log.w(TAG,"Network not available");
            }
        };
Run Code Online (Sandbox Code Playgroud)

我可以从我的日志语句中看到请求和绑定成功。但是,当我随后调用ConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)它时,它告诉我网络已断开连接(并且我尝试轮询以查看更新网络信息是否有延迟,但也没有成功)。

android android-networking android-connectivitymanager

8
推荐指数
0
解决办法
1503
查看次数

在Android 3.x和4.x上为Wifi网络分配静态IP地址

我在一个项目上工作,应该有一个功能,Wifi如果用户想要它,设置静态IP地址(DNS,网络掩码,网关).

我的初始和实际解决方案是使用android.provider.Settings.System允许此功能的类,但此解决方案仅适用于Android 2.x设备.

这很好,绝对不是完全零,但是对于更高版本的Android操作系统来说它也很好.它不知道为什么它不起作用.

如果我使用这个简单的方法来检查实际状态:

public static final boolean hasStaticIp(Context c) {
    try {
        return Settings.System.getInt(c.getContentResolver(), 
                                        Settings.System.WIFI_USE_STATIC_IP) == 1;
    }
    catch (SettingNotFoundException e) {
        Log.i(TAG, "Settings not found (" + e.geMessage() + ")");
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

它对于Android 2.x和Android 4.x都返回true,但在第二种情况下,更改肯定没有反映在Wifi我发现这是一个小硬编码的解决方案,但它没有按预期工作.

是否有人面临同样的问题?

我会很高兴任何有效的解决方案以及root设备(也许是Linux中的一些命令),因为很容易检查手机是否有根的状态.

提前致谢.

android ipv4 android-networking android-wifi

7
推荐指数
1
解决办法
8657
查看次数

如何在Retrofit中自定义响应体JSON转换?

我正在使用Retrofit来实现Rest Client,在尝试将响应体转换为模型Object时遇到了一些麻烦.

我的界面中有以下内容:

@POST("/users")
void createUser(@Body RegisterUserToken token, Callback<User> callback);
Run Code Online (Sandbox Code Playgroud)

我的User课基本上是一个POJO:

public class User {

    private int id;
    private String username;
    private String email;
    private String language;
    // getters and setters...
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用Rest Client的方式:

restClient.createUser(token, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // ...problem is here, with the user object
    }

    @Override
    public void failure(RetrofitError error) {
        // ...
    }
});
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是响应主体没有被转换为User对象.我很确定问题是服务器正在返回:

{"user":{"id":13,"username":"john","email":"john@gmail.com","language":"eng"}}
Run Code Online (Sandbox Code Playgroud)

而不仅仅是:

{"id":13,"username":"john","email":"john@gmail.com","language":"eng"}
Run Code Online (Sandbox Code Playgroud)

鉴于我无法真正修改服务器代码,我如何自定义Retrofit/GSON以正确地将此响应主体转换为我的User对象?

android android-networking retrofit

7
推荐指数
1
解决办法
3874
查看次数

Square的Retrofit响应解析逻辑:流媒体?

你能解释一下Square的Retrofit响应解析逻辑吗?我感兴趣的是我们应该接收并解析一个大的json(> 100Kb) - 将等待所有内容从服务器收到而不是解析它,或者它会在获取流数据时立即解析它吗?我的目标是加快响应处理速度.

有没有可供配置的选项?

json android-networking retrofit

7
推荐指数
1
解决办法
1034
查看次数

如何在双卡安卓手机中获取连接到互联网的运营商名称?

我做了一个网络监控应用程序.在这里,我成功地实现了所有的事情.我有双卡通android手机.我知道如何获得运营商的名称.但我想知道哪个SIM连接到互联网?我使用过此代码,仅向用户显示设备是通过移动数据连接的.我想更具体地说,该设备目前正在使用哪个运营商的互联网.

public static String isInternetConnected (Context ctx) {
        ConnectivityManager connectivityMgr = (ConnectivityManager) ctx
                .getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo wifi = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo mobile = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        // Check if wifi or mobile network is available or not. If any of them is
        // available or connected then it will return true, otherwise false;
        if (wifi != null) {
            if (wifi.isConnected()) {
                return "wifi";
            }
        }
        if (mobile != null) {
            if (mobile.isConnected()) {
                return "mobile";
            }
        }
        return "none";
    }
Run Code Online (Sandbox Code Playgroud)

android android-networking

7
推荐指数
1
解决办法
1306
查看次数

Android:应设置什么音频模式以在设备之间发送接收语音

我正在尝试在两个Android设备平板电脑和移动设备(通过Java套接字)之间传输语音/音频(双向).

平板电脑可以清晰播放收到的音频(语音),但手机播放的音频是噪音.
然后我在平板电脑上的代码中设置此音频模式:
audioManager.setMode(AudioManager.MODE_IN_CALL);

这导致移动接收清晰的语音.但平板电脑变得沉默,它不会播放收到的音频(或者说它听不到).

我不确定我应该在这里使用哪种AudioManager模式组合(如果有的话)?

android android-networking android-audiomanager android-audiorecord

7
推荐指数
1
解决办法
1048
查看次数

如何在翻新GET请求中发送对象参数?

我有一个像这样的后端服务器

"api/videos?search_object={"cat_id" :2, "channel_id" : 3, etc}
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将搜索对象作为输入,它会基于该对象过滤列表。现在,我想将此服务与Retrofit一起使用,就像这样

@GET("videos")
Call<VideoListResponse> listVideos(@Query("search_object") VideoSearchObject videoSearchObject);
Run Code Online (Sandbox Code Playgroud)

但是上面的代码不起作用,我可以先将VideoSearchModel转换为JSON字符串,然后将其传递给它进行改造

@GET("videos")
Call<VideoListResponse> listVideos(@Query("search_object") String jsonString);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好更好的方法?任何建议将不胜感激。

android gson android-networking retrofit retrofit2

7
推荐指数
2
解决办法
4778
查看次数

使用 OkHttp 时是否可以限制带宽?

使用 OkHttp 来限制带宽时是否可能?(可能使用网络拦截器)。

android android-networking okhttp okhttp3

7
推荐指数
1
解决办法
497
查看次数

javax.net.ssl.SSLHandshakeException:java.lang.IllegalArgumentException:toASCII的输入无效:ip_nbae7bac35.kodrive.xyz

这个例外有解决方法吗?在github上看这个问题听起来它可能是一个android bug,有关主机名有下划线字符的东西.

这是堆栈跟踪:

javax.net.ssl.SSLHandshakeException: java.lang.IllegalArgumentException: Invalid input to toASCII: ip_nbae7bac35.kodrive.xyz
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:219)
        at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:318)
        at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:282)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:167)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
        at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at okhttp3.RealCall.execute(RealCall.java:77)
Run Code Online (Sandbox Code Playgroud)

android android-networking okhttp okhttp3

7
推荐指数
1
解决办法
900
查看次数

requestCellInfoUpdate() 的正确用法是什么?

利用onSignalStrengthsChangedgetAllCellInfo()和相关方法,我的应用程序监视细胞信号数据并实时显示结果。我的代码在针对 API 28 及更低版本时工作得非常好,可以在数据发生变化时自动刷新数据。以 API 29 为目标会导致部分Android 10 设备无法更新数据,但并非全部。

我发现TelephonyManager.requestCellInfoUpdate()已添加到 API 29,可能(?)需要它来解决此问题。但是,除了Android Reference 上的简洁定义之外,我无法找到有关此方法的任何信息。是否需要使用该方法来刷新cell信息?是否有任何代码示例或进一步的解释?

如果该方法不相关,API 29 中是否存在可能导致此行为的其他更改?ACCESS_FINE_LOCATION已确认获得批准,这似乎是唯一的其他相关 API 更改。

android android-networking android-10.0

7
推荐指数
1
解决办法
3174
查看次数