通过手机上安装的第三方播放器来播放APK内的视频文件
刚开始在网上查了很多资料,因为以前做过 通过第三方播放器播放本地视频的功能
大概代码如下
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/Test_Movie.m4v");
//调用系统自带的播放器
Intent intent = new Intent(Intent.ACTION_VIEW);
"URI:::::::::", uri.toString());
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
把视频文件放到raw文件夹中或者assets文件夹下,获取的URI,传递给Intent后都提示视频不存在
而这个URI通过videoView播放的话是没有问题的
所以判断是APK内的视频只能输出流给外部,无法通过URI让第三方调用
所以考虑 另一种方案:
在APK初次安装时把视频文件写入SD卡中,试过后可以实现功能,
代码如下
manifest中需要如下权限
<!-- SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//MainActivity的OnCreate()方法中执行createFile();方法
private String
android.os.Environment.
getExternalStorageDirectory().getAbsolutePath()
//
得到外部存储卡的数据库的路径名
+
"/wavebot/example/"
;
//
我要存储的目录
private String
fileName =
"example.mp4"
;
//
要存储的文件名
/**
*
复制文件到
SD
卡
*
*/
private void
createFile() {
String filePath =
fileDirPath +
"/" +
fileName
;
//
文件路径
try {
File dir =
new File(
fileDirPath)
;
//
目录路径
if (!dir.exists()) {
//
如果不存在,则创建路径名
Log.
v (
TAG
,
"
要存储的目录不存在
")
;
if (dir.mkdirs()) {
//
创建该路径名,返回
true
则表示创建成功
Log.
v (
TAG
,
"
已经创建文件存储目录
")
;
}
else {
Log.
v (
TAG
,
"
创建目录失败
")
;
}
}
//
目录存在,则将
apk
中
raw
中的需要的文档复制到该目录下
File file =
new File(filePath)
;
if (!file.exists()) {
//
文件不存在
Log.
v(
TAG
,
"
要打开的文件不存在
")
;
example)
;
//
通过
raw
得到数据资源
Log.
v (
TAG
,
"
开始读入
")
;
FileOutputStream fos =
new FileOutputStream(file)
;
Log.
v (
TAG
,
"
开始写出
")
;
byte[] buffer =
new byte[
8192]
;
int count =
0
;
//
循环写出
while ((count = ins.read(buffer)) >
0) {
fos.write(buffer
,
0
, count)
;
}
Log.
v (
TAG
,
"
已经创建该文件
")
;
fos.close()
;
//
关闭流
ins.close()
;
}
}
catch (Exception e) {
e.printStackTrace()
;
}
播放视频的时候 直接调用
new Intent(
"android.intent.action.VIEW")
;
intent.addFlags(Intent.
FLAG_ACTIVITY_CLEAR_TOP)
;
intent.putExtra(
"oneshot"
,
0)
;
intent.putExtra(
"configchange"
,
0)
;
Uri uri = Uri.
fromFile(
new File(android.os.Environment
.
getExternalStorageDirectory().getAbsolutePath()
//
得到外部存储卡的数据库的路径名
+
"/wavebot/example/example.mp4"))
;
intent.setDataAndType(uri
,
"video/*")
;
;
但是考虑会占用 手机SD卡的内存,也不是最完美的解决方案,在此记录,以后找到更完美的方案,再做修改