我正在尝试暂时强制设备使用移动数据。我在用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)它时,它告诉我网络已断开连接(并且我尝试轮询以查看更新网络信息是否有延迟,但也没有成功)。
我在一个项目上工作,应该有一个功能,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中的一些命令),因为很容易检查手机是否有根的状态.
提前致谢.
我正在使用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对象?
你能解释一下Square的Retrofit响应解析逻辑吗?我感兴趣的是我们应该接收并解析一个大的json(> 100Kb) - 将等待所有内容从服务器收到而不是解析它,或者它会在获取流数据时立即解析它吗?我的目标是加快响应处理速度.
有没有可供配置的选项?
我做了一个网络监控应用程序.在这里,我成功地实现了所有的事情.我有双卡通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设备平板电脑和移动设备(通过Java套接字)之间传输语音/音频(双向).
平板电脑可以清晰播放收到的音频(语音),但手机播放的音频是噪音.
然后我在平板电脑上的代码中设置此音频模式:
audioManager.setMode(AudioManager.MODE_IN_CALL);
这导致移动接收清晰的语音.但平板电脑变得沉默,它不会播放收到的音频(或者说它听不到).
我不确定我应该在这里使用哪种AudioManager模式组合(如果有的话)?
android android-networking android-audiomanager android-audiorecord
我有一个像这样的后端服务器
"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)
我想知道是否有更好更好的方法?任何建议将不胜感激。
使用 OkHttp 来限制带宽时是否可能?(可能使用网络拦截器)。
这个例外有解决方法吗?在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) 利用onSignalStrengthsChanged、getAllCellInfo()和相关方法,我的应用程序监视细胞信号数据并实时显示结果。我的代码在针对 API 28 及更低版本时工作得非常好,可以在数据发生变化时自动刷新数据。以 API 29 为目标会导致部分Android 10 设备无法更新数据,但并非全部。
我发现TelephonyManager.requestCellInfoUpdate()已添加到 API 29,可能(?)需要它来解决此问题。但是,除了Android Reference 上的简洁定义之外,我无法找到有关此方法的任何信息。是否需要使用该方法来刷新cell信息?是否有任何代码示例或进一步的解释?
如果该方法不相关,API 29 中是否存在可能导致此行为的其他更改?ACCESS_FINE_LOCATION已确认获得批准,这似乎是唯一的其他相关 API 更改。
android ×9
retrofit ×3
okhttp ×2
okhttp3 ×2
android-10.0 ×1
android-connectivitymanager ×1
android-wifi ×1
gson ×1
ipv4 ×1
json ×1
retrofit2 ×1