设为首页 收藏本站 662p开源网
开启辅助访问 切换到宽版

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

切换风格 立即注册 找回密码

安卓教程网

发表于 2019-4-30 11:22:03 | 显示全部楼层 |阅读模式
更多
android9.0使用AndroidVideoCache时不能缓存播放视频的解决
一、问题现象:
项目中使用 https://github.com/danikula/AndroidVideoCache 作为视频缓存组件,但是在9.0手机上无法正常缓存,并且报错:
1、详细错误截图
2、详细错误文本描述
  1. 2018-11-16 14:35:19.781 31012-32296/com.xxx.xxx E/Pinger: Error reading ping response
  2.     com.danikula.videocache.ProxyCacheException: Error opening connection for http://127.0.0.1:34851/ping with offset 0. Version: 2.7.0
  3.         at com.danikula.videocache.HttpUrlSource.open(HttpUrlSource.java:75)
  4.         at com.danikula.videocache.Pinger.pingServer(Pinger.java:101)
  5.         at com.danikula.videocache.Pinger.access$100(Pinger.java:33)
  6.         at com.danikula.videocache.Pinger$PingCallable.call(Pinger.java:123)
  7.         at com.danikula.videocache.Pinger$PingCallable.call(Pinger.java:119)
  8.         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  9.         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
  10.         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  11.         at java.lang.Thread.run(Thread.java:784)
  12.      Caused by: java.io.IOException: Cleartext HTTP traffic to 127.0.0.1 not permitted
  13.         at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
  14.         at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
  15.         at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
  16.         at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
  17.         at com.danikula.videocache.HttpUrlSource.openConnection(HttpUrlSource.java:160)
  18.         at com.danikula.videocache.HttpUrlSource.open(HttpUrlSource.java:68)
  19.         at com.danikula.videocache.Pinger.pingServer(Pinger.java:101)
  20.         at com.danikula.videocache.Pinger.access$100(Pinger.java:33)
  21.         at com.danikula.videocache.Pinger$PingCallable.call(Pinger.java:123)
  22.         at com.danikula.videocache.Pinger$PingCallable.call(Pinger.java:119)
  23.         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  24.         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
  25.         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  26.         at java.lang.Thread.run(Thread.java:784)
  27. 2018-11-16 14:35:19.783 31012-31012/com.xxx.xxx E/Pinger: Error pinging server (attempts: 3, max timeout: 280). If you see this message, please, report at https://github.com/danikula/AndroidVideoCache/issues/134. Default proxies are: [DIRECT]
  28.     com.danikula.videocache.ProxyCacheException: Error pinging server (attempts: 3, max timeout: 280). If you see this message, please, report at https://github.com/danikula/AndroidVideoCache/issues/134. Default proxies are: [DIRECT]. Version: 2.7.0
  29.         at com.danikula.videocache.Pinger.ping(Pinger.java:73)
  30.         at com.danikula.videocache.HttpProxyCacheServer.isAlive(HttpProxyCacheServer.java:183)
  31.         at com.danikula.videocache.HttpProxyCacheServer.<init>(HttpProxyCacheServer.java:82)
  32.         at com.danikula.videocache.HttpProxyCacheServer.<init>(HttpProxyCacheServer.java:67)
  33.         at com.xxx.mqtt.tools.CusApplication.newProxy(CusApplication.java:192)
  34.         at com.xxx.mqtt.tools.CusApplication.getProxy(CusApplication.java:182)
  35.         at com.xxx.video.activity.VideoPreviewActivity.onCreate(VideoPreviewActivity.java:59)
  36.         at android.app.Activity.performCreate(Activity.java:7444)
  37.         at android.app.Activity.performCreate(Activity.java:7434)
  38.         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
  39.         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3269)
  40.         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3474)
  41.         at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
  42.         at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
  43.         at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
  44.         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2115)
  45.         at android.os.Handler.dispatchMessage(Handler.java:109)
  46.         at android.os.Looper.loop(Looper.java:207)
  47.         at android.app.ActivityThread.main(ActivityThread.java:7439)
  48.         at java.lang.reflect.Method.invoke(Native Method)
  49.         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
  50.         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
复制代码

二、问题原因:
根本原因是从Android9.0开始,出于完全因素考虑,默认不再支持http网络请求,需要使用 https。
但是,在AndroidVideoCache中使用了一个缓存代理地址:http://127.0.0.1,所以,就会报错。
三、解决方案:
解决的基本思路是:对指定的网址进行过滤,强制允许指定网址继续使用http请求
下列解决步骤基于参考地址1整理:
1、步骤1A:创建 res/xml/network_security_config.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <network-security-config>
  3.     <domain-config cleartextTrafficPermitted="true">
  4.         <domain includeSubdomains="true">Your URL(ex: 127.0.0.1)</domain>
  5.     </domain-config>
  6. </network-security-config>
复制代码


注意:
上述代码的意思是解除对指定网址的限制。
在解除上述视频缓存库报错信息时,<domain> 节点的具体取值如下:
<domain includeSubdomains="true"> 127.0.0.1</domain>
如果需要过滤某个地址,则只写域名即可,不需要写 http://,如:想过滤的地址为:http://www.662p.com/123,则<demain>节点如下:
<domain includeSubdomains="true"> www.662p.com</domain>B:修改 AndroidManifest.xml
配置 android:networkSecurityConfig
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest ...>
  3.     <uses-permission android:name="android.permission.INTERNET" />
  4.     <application
  5.         ...
  6.         android:networkSecurityConfig="@xml/network_security_config"
  7.         ...>
  8.         ...
  9.     </application>
  10. </manifest>
复制代码


2、步骤2A:修改AndroidManifest.xml
启用 android:usesCleartextTraffic
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest ...>
  3.     <uses-permission android:name="android.permission.INTERNET" />
  4.     <application
  5.         ...
  6.         android:usesCleartextTraffic="true"
  7.         ...>
  8.         ...
  9.     </application>
  10. </manifest>
复制代码


3、步骤3
在 @david.s'的回答中指出 android:targetSandboxVersion 也可能会导致该问题 -
在 Manifest Docs https://developer.android.com/gu ... argetSandboxVersion 中对于 android:targetSandboxVersion有如下描述
android:targetSandboxVersion
The target sandbox for this app to use. The higher the sandbox version number, the higher the level of security. Its default value is 1; you can also set it to 2. Setting this attribute to 2 Switches the app to a different SELinux sandbox. The following restrictions apply to a level 2 sandbox:
The default value of usesCleartextTraffic in the Network Security Config is false.
Uid sharing is not permitted.
所以,如果你在 AndroidManifest.xml 的 <manifest> 节点中配置了 android:targetSandboxVersion,需要将它的值置为1.
A:修改AndroidManifest.xml
降低 android:targetSandboxVersion 的版本
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest android:targetSandboxVersion="1">
  3.     <uses-permission android:name="android.permission.INTERNET" />
  4.     ...
  5. </manifest>
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x

新浪微博达人勋

注册会员

116

积分

36

威望

2

金钱

Rank: 2

积分
116
发表于 2019-4-30 11:24:39 | 显示全部楼层
为保住菊花,这个一定得回复!

新浪微博达人勋

中级会员

240

积分

34

威望

138

金钱

Rank: 3Rank: 3

积分
240
发表于 2019-4-30 16:11:19 | 显示全部楼层
我也来顶一下..

新浪微博达人勋

注册会员

51

积分

17

威望

0

金钱

Rank: 2

积分
51
发表于 2019-5-2 01:02:17 | 显示全部楼层
啥玩应呀

新浪微博达人勋

注册会员

90

积分

30

威望

0

金钱

Rank: 2

积分
90
发表于 2019-5-3 15:20:54 | 显示全部楼层
安卓我的最爱

新浪微博达人勋

注册会员

102

积分

34

威望

0

金钱

Rank: 2

积分
102
发表于 2019-5-7 16:35:37 | 显示全部楼层
大人,此事必有蹊跷!

新浪微博达人勋

新手上路

26

积分

13

威望

2

金钱

Rank: 1

积分
26
发表于 2019-5-9 10:58:19 | 显示全部楼层
安卓我的最爱
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Archiver|手机版|小黑屋|安卓教程网 ( 粤ICP备12089784号  

GMT+8, 2019-5-27 16:05 , Processed in 0.630094 second(s), 51 queries .

Powered by Discuz X3.1

© 2001-2013 IOS教程网

快速回复 返回顶部 返回列表