各种报错问题,集合解决办法

java.net.SocketException: socket failed: EPERM (Operation not permitted)

java.net.SocketException:socket failed:EACCES (Permission denied)

java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permitted

D/Netw at java.net.Socket.createImpl(Socket.java:492)orkSecurityConfig: No Network Security Config specified, using platform default

java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permitted

java.lang.RuntimeException: Can't create handler inside thread Thread that has not called Looper.prepare()

等等等等


方法一:

在AndroidManifest.xml文件中,在<application></application>同级添加网络权限↓:

<uses-permission android:name="android.permission.INTERNET"/>

并在手级上卸载重新安装APP

或把这两句也加上

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

方法二:

在AndroidManifest.xml文件中,在<application>的属性里添加

android:usesCleartextTraffic="true"

此属性指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。

当属性设置为“ false”时,平台组件(例如,HTTP和FTP堆栈,DownloadManager和MediaPlayer)将拒绝应用程序使用明文流量的请求。强烈建议第三方库也采用此设置。避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。


方法三:

在更高的编译版本中可能上一个办法也没有用,则需要添加配置文件network_security_config.xml

在res文件夹下面新建一个名为xml的文件夹

android10连接wifi android10 网络连接受限_android-studio

 新建一个network_security_config.xml文件,内容为:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!--    给app添加证书-->
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>

    <!--    android:usesCleartextTraffic="true"在配置文件里的写法-->
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

方法四:

在MainActivity.java的onCreate方法里设置

//        设置允许安卓发起网络请求
//        StrictMode是指严格模式
        if (Build.VERSION.SDK_INT > 9){
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
            StrictMode.setThreadPolicy(policy);//这两句设置禁止所有检查
        }

StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。


方法五:

Android模拟器中访问http://localhost:8080失败

原因:Android模拟器把它自己作为了localhost,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器的地址;

解决方案:使用android内置的IP 10.0.2.2 ,10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名;即:http://10.0.2.2:8080

但是有例外的情况,如果使用的不是Android studio自带的模拟器,则需要查看自己电脑的IPv4地址来使用。

android10连接wifi android10 网络连接受限_android10连接wifi_02


方法六:

谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。

创建线程的方法:

//简单的创建一个新线程
new Thread(new Runnable() {
                @Override
                public void run() {
                   //运行部分的代码放在这一块
                }
            }).start();

Can't create handler inside thread Thread that has not called Looper.prepare()通常是在子线程中使用没有绑定Looper的handler时出现,只需在handler语句的前后加Looper.prepare()和Looper.loop()方法即可。  即:

//简单的创建一个新线程
new Thread(new Runnable() {
                @Override
                public void run() {
                   Looper.perpare();
                   //运行部分的代码放在这一块
                   Looper.loop();
                }
            }).start();