我想知道为什么wifi连接但Android没有互联网接入.我怎么检查它?我的代码是:
ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nf=cn.getActiveNetworkInfo();
if(nf != null && nf.isConnected() )
{
Flag2=false;
Log.e("network--------", "1--------------");
if (cn.getActiveNetworkInfo().isConnectedOrConnecting())
{Log.e("network--------", "11111111111111--------------");
}
else
{Log.e("network--------", "2222222222222--------------");
}
}
else
{
Log.e("network--------", "2--------------");
}
Run Code Online (Sandbox Code Playgroud) recived = TrafficStats.getUidRxBytes(uid);
send = TrafficStats.getUidTxBytes(uid);
TrafficStats.getMobileRxBytes();
TrafficStats.getMobileTxBytes();
TrafficStats.getTotalRxBytes();
TrafficStats.getTotalTxBytes();
Run Code Online (Sandbox Code Playgroud)
我有应用程序ID,我可以获得该应用程序数据使用,但我无法获得更详细的信息,如使用wifi和网络的数据使用.我想在设备中单独找到所有已安装的应用程序.我怎么能找到那个.?我已经尝试了很多东西,但没有得到任何解决方案.
我想改变首选的网络模式,即.在Android上以编程方式从代码中获取gsm或wcdma或auto.
这是可能的,如果是这样的话怎么样?
由于各种原因,我需要runOnUiThread()实际的WebView实例化和初始化.
这意味着它的底层HTTP连接也是在UI线程上进行的?
如果这是真的,是否可以将WebView的UI thead与HTTP连接线程分开?
如果有可能,实现这一目标的正确方法是什么?
android httpconnection android-networking android-webview android-asynctask
我正在尝试将测试文件发布到使用Android部署在tomcat上的spring rest servlet.我正在开发Android 4.1.2,但我已经在4.0.3上验证了同样的问题.
问题是文件上传需要很长时间(对于4MB文件大约需要70秒),也在本地网络中.使用3g连接可以节省时间.我已经排除它可能是服务器问题:使用curl执行相同的调用需要1/2秒,并且使用apache作为后端结果是相同的.
使用HttpClient工作正常.
我正在使用Spring Android RestClient 1.0.1.RELEASE,并且考虑到Android版本以及我没有覆盖默认行为的事实,它使用HttpUrlConnection而不是HttpClient来发出http请求.
我还实现了我的自定义ClientHttpRequestFactory,以便操纵SSL连接的一些细节,我已经定义了自己的ClientHttpRequestInterceptor实现,以便修改身份验证头.
我也设置setBufferRequestBody(false)为了避免OutOfMemoryException大文件.但是这个属性对所需的时间没有影响.
MyClientHttpRequestFactory:
public class MyClientHttpRequestFactory extends SimpleClientHttpRequestFactory{
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
super.prepareConnection(connection, httpMethod);
connection.setConnectTimeout(240 * 1000);
connection.setReadTimeout(240 * 1000);
if ("post".equals(httpMethod.toLowerCase())) {
setBufferRequestBody(false);
}else {
setBufferRequestBody(true);
}
}
@Override
protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException {
final HttpURLConnection httpUrlConnection = super.openConnection(url, proxy);
if (url.getProtocol().toLowerCase().equals("https")
&&
settings.selfSignedCert().get())
{
try {
((HttpsURLConnection)httpUrlConnection).setSSLSocketFactory(getSSLSocketFactory());
((HttpsURLConnection)httpUrlConnection).setHostnameVerifier(new NullHostnameVerifier());
} catch …Run Code Online (Sandbox Code Playgroud) performance spring android httpurlconnection android-networking
我正在使用retrofit 2.x,我想记录请求和响应的标题和正文.
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addNetworkInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder()
.addHeader("key", "value")
.addHeader("HEADER","HEADER Value")
.build();
return chain.proceed(request);
}
}).build();
Run Code Online (Sandbox Code Playgroud)
这就是我正在做的,我的问题是请求的标题没有记录在Android监视器,但休息一切都记录下来.
Gradle版本
compile ('com.squareup.retrofit2:retrofit:2.0.0-beta3') {
// exclude Retrofit’s OkHttp peer-dependency module and define your own module import
exclude module: 'okhttp'
}
compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3'
compile ('com.squareup.okhttp3:logging-interceptor:3.0.1'){
exclude module: 'okhttp'
}
Run Code Online (Sandbox Code Playgroud)
由于bug问题使用RC1和3.0.1报告了Bug Link
我的目标是从Android 4.0使用REST Web服务HttpsURLConnection.除非我尝试POST某种方法,否则这种方法很好 这是相关的代码部分:
connection.setDoOutput(true);
connection.setChunkedStreamingMode(0);
ByteArrayOutputStream out = new ByteArrayOutputStream();
serializeObjectToStream(out, object);
byte[] array = out.toByteArray();
connection.getOutputStream().write(array, 0, array.length);
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常:
java.net.HttpRetryException: Cannot retry streamed HTTP body
Run Code Online (Sandbox Code Playgroud)
从调试中我意识到我得到的输出流connection.getOuputStream()是类型的,ChunkedOutputStream并且从挖掘Androids源代码中我认为如果需要重试请求(无论出于何种原因),它会引发上述异常,因为它会发现它是不是用RetryableOutputStream它想在那里.
现在的问题是:如何使我的HttpsURLConnection返回这样的RetryableOutputStream,或者更确切地说,如何正确地阻止分块请求编码?我以为我已经这样做了setChunkedStreamingMode(0),但显然事实并非如此......
[编辑]
不,执行java.net.HTTPUrlConnection忽略0或更低的流模式:
public void setChunkedStreamingMode(int chunkLength) {
[...]
if (chunkLength <= 0) {
this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH;
} else {
this.chunkLength = chunkLength;
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个功能哪个网络连接
public boolean isNetworkConnected() {
ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conManager.getActiveNetworkInfo();
if (netInfo == null) {
// There are no active networks.
return false;
} else {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我试图让它静态,以便我可以在它抛出的每个活动中使用它:
无法从类型中对非静态方法getSystemService(String)进行静态引用
我不想每次都创建类的对象.
我正在开发一个android项目,我计划用OKHTTP客户端替换Apache httpclient实现.我想知道如何创建一个全局客户端,可以用于将使用客户端多线程的不同活动和服务中的网络请求.我应该创建一个OKHTTPClient的单例对象并在我的代码中重用它吗?
此外,我应该在哪里将cookiestore添加到请求中,在客户端的全局定义中,以便我所有请求都可以使用cookie或在个人活动或服务中形成请求?
似乎多播接收在某些Android设备上不起作用.我无法通过13个测试设备中的4个接收多播.在这4个设备上,应用程序似乎不发送加入多播组的IGMP请求.
接收多播的代码如下所示:
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG);
multicastLock.setReferenceCounted(true);
wifiLock.acquire();
multicastLock.acquire();
try {
MulticastSocket socket = new MulticastSocket(32123);
InetAddress group = InetAddress.getByName("224.1.2.3");
socket.joinGroup(group);
DatagramPacket packet;
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
socket.leaveGroup(group);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
multicastLock.release();
wifiLock.release();
Run Code Online (Sandbox Code Playgroud)
该应用具有以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)
为了演示这个问题,我在GitHub:MulticastTest上使用上面的代码创建了一个小测试项目.
我的代码有问题吗?我错过了许可吗?
编辑1:此问题似乎与特定的Android版本无关.我可以在Android 4.x,5.x和6.x上重现这种行为.
编辑2:有一个相关的问题.
android ×10
android-wifi ×1
cookies ×1
igmp ×1
java ×1
multicast ×1
networking ×1
okhttp ×1
performance ×1
retrofit ×1
retrofit2 ×1
spring ×1
telephony ×1