通过手机上安装的第三方播放器来播放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卡的内存,也不是最完美的解决方案,在此记录,以后找到更完美的方案,再做修改