场景 :
技术栈选型:aj2 + cordova + ionic
需要解决的问题 :无法通过<video>的src指定file:///sdcard 播放本地缓存的视频
根本原因 : aj2无法访问外部资源
解决思路 :
因为此方案可以通过通过http/https方式访问网络资源。由此可见,我们可以通过移动端自身构建本地服务来解决此类问题,提供一个接口用以提供流媒体资源,当访问http://localhost:xxx/xxx的请求方式来获取媒体资源。构建一个基于本地服务的虚拟网络请求。
解题方法:
1.使用添加第三方本地服务构建工具。(在此使用的是android anync)
2.提供媒体访问接口服务
LocalHttpServer
package io.ionic.starter;
import android.os.Environment;
import android.util.Log;
import com.koushikdutta.async.http.server.AsyncHttpServer;
import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
import com.koushikdutta.async.http.server.HttpServerRequestCallback;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class LocalHttpServer implements HttpServerRequestCallback {
private static final String TAG = "LocalHttpServer";
private static LocalHttpServer mInstance;
public static int PORT_LISTEN_DEFALT = 5000;
AsyncHttpServer server = new AsyncHttpServer();
public static LocalHttpServer getInstance() {
if (mInstance == null) {
//增加类锁,保证只初始化一次
synchronized (LocalHttpServer.class) {
if (mInstance == null) {
mInstance = new LocalHttpServer();
}
}
}
return mInstance;
}
public void stopServer(){
server.stop();
}
public void startServer() {
server.addAction("OPTIONS", "[\\d\\D]*", this);
server.addAction("GET", "[\\d\\D]*", this);
server.get("[\\d\\D]*", this);
server.post("[\\d\\D]*", this);
server.listen(PORT_LISTEN_DEFALT);
}
@Override
public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
Log.d(TAG, "come in");
String uri = request.getPath();
Log.d(TAG, "uri="+uri);
try {
sendAssignFile(response,"yoga.mp4");
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendAssignFile(AsyncHttpServerResponse response, String pathTemp) throws IOException {
File file = new File(Environment.getExternalStorageDirectory(), pathTemp);
FileInputStream stream = new FileInputStream(file);
response.setContentType(AsyncHttpServer.getContentType(pathTemp));
response.sendStream(stream, stream.available());
}
}
3.在cordova启动页启动服务
注意:
参数:
端口监听:
请求方式限制:
path限制:
为了测试方便固定返回文件名:
4.所以可以进行 测试<video src = "http://localhost:5000/1">
5.结论 可以正常获得媒体流。
原理:
通过构建本地服务打通本地资源跟aj2的一个访问桥梁,通过接口也可以代理更多的sd卡资源,比如图片,音频,等等