标签: android-networking

如何检查Wifi是否已连接,但Android中无法访问Internet

我想知道为什么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)

android android-networking

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

如何在android中分别找到特定应用程序的wifi和网络数据使用情况?

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 android-networking android-wifi

13
推荐指数
2
解决办法
7939
查看次数

更改移动网络模式(gsm,wcdma,auto)

我想改变首选的网络模式,即.在Android上以编程方式从代码中获取gsm或wcdma或auto.

这是可能的,如果是这样的话怎么样?

android telephony android-networking

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

是否可以分离WebView的UI和HTTP线程?

由于各种原因,我需要runOnUiThread()实际的WebView实例化和初始化.

这意味着它的底层HTTP连接也是在UI线程上进行的?

如果这是真的,是否可以将WebView的UI thead与HTTP连接线程分开?

如果有可能,实现这一目标的正确方法是什么?

android httpconnection android-networking android-webview android-asynctask

12
推荐指数
1
解决办法
3671
查看次数

Android HttpUrlConnection:发布Multipart

我正在尝试将测试文件发布到使用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

12
推荐指数
1
解决办法
4018
查看次数

Retrofit 2.x:请求和响应的日志标头

我正在使用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 android-networking retrofit retrofit2

12
推荐指数
3
解决办法
5810
查看次数

如何在Android中明确禁用HTTP连接的分块流模式?

我的目标是从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)

java android android-networking

11
推荐指数
1
解决办法
8589
查看次数

无法从类型中对非静态方法getSystemService(String)进行静态引用

我有这个功能哪个网络连接

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 android-intent android-networking android-internet

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

Android使用OKHTTP单例进行并行查询的正确方法

我正在开发一个android项目,我计划用OKHTTP客户端替换Apache httpclient实现.我想知道如何创建一个全局客户端,可以用于将使用客户端多线程的不同活动和服务中的网络请求.我应该创建一个OKHTTPClient的单例对象并在我的代码中重用它吗?

此外,我应该在哪里将cookiestore添加到请求中,在客户端的全局定义中,以便我所有请求都可以使用cookie或在个人活动或服务中形成请求?

cookies android android-networking okhttp

11
推荐指数
1
解决办法
6939
查看次数

为什么多播接收不适用于某些Android设备?

似乎多播接收在某些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:有一个相关的问题.

networking android multicast igmp android-networking

10
推荐指数
1
解决办法
3838
查看次数