使用libmedia的Android Play加密视频:java.io.FileNotFoundException:没有内容提供者:

时间:2016-07-19 06:19:20

标签: android video encryption

我有基本应用程序,可以使用libmedia lib播放加密视频。

视频加密方法正常运行。

但是在播放视频时会显示此错误消息

  

路径为空    setDataSource IOException occurrence发生:java.io.FileNotFoundException:没有内容提供者:http://127.0.0.1:36316/http://127.0.0.1:36316/storage/emulated/0/AB/b.mp4

这是我的加密方法

    public static void encrypt() throws Exception {
    final byte[] buf = new byte[8192];
    final Cipher c = Cipher.getInstance("AES/CTR/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("1234567890123456".getBytes(), "AES"), new IvParameterSpec(new byte[16]));
    final InputStream is = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/"+"a.mp4");
    final OutputStream os = new CipherOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/"+"b.mp4"), c);
    while (true) {
        int n = is.read(buf);
        if (n == -1) break;
        os.write(buf, 0, n);
    }
    os.close(); is.close();
}

这是我的播放按钮

PlayBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/AB/b.mp4");

           try {
              mServer = new LocalSingleHttpServer();
            } catch (IOException e) {
               e.printStackTrace();
           }

           String path = mServer.getURL(file.getPath());

            try {
                mServer.setCipher(myGetCipher());
                mServer.start();
                path = mServer.getURL(path);
                videoView.setVideoPath(path);
                videoView.start();
            }catch (Exception e){
             e.printStackTrace();
            }



        }
    });

GetCyper()方法

 private Cipher myGetCipher() throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException {
    // avoid the default security provider "AndroidOpenSSL" in Android 4.3+ (http://libeasy.alwaysdata.net/network/#provider)
    Cipher c = Cipher.getInstance("ARC4", "BC");
    c.init(Cipher.DECRYPT_MODE, new SecretKeySpec("BrianIsInTheKitchen".getBytes(), "ARC4"));
    return c;
}

编译

  

compileSdkVersion 23
  buildToolsVersion" 23.0.3"

错误消息

setDataSource IOException happend : 
                                java.io.FileNotFoundException: No content provider: http://127.0.0.1:40208/storage/emulated/0/AB/b.mp4
                                at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1053)
                                at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907)
                                at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834)
                                at android.media.MediaPlayer.setDataSource(MediaPlayer.java:979)
                                at android.widget.VideoView.openVideo(VideoView.java:338)
                                at android.widget.VideoView.setVideoURI(VideoView.java:248)
                                at android.widget.VideoView.setVideoURI(VideoView.java:238)
                                at android.widget.VideoView.setVideoPath(VideoView.java:234)
                                at encrypt.amg.com.encryptiont2.MainActivity$2$override.onClick(MainActivity.java:89)

3 个答案:

答案 0 :(得分:2)

你两次调用getURL。

String path = mServer.getURL(file.getPath());

path = mServer.getURL(path);

答案 1 :(得分:2)

天空的答案是真的:无论如何,修复对getURL()的双重调用是强制性的。

之后,日志条目java.io.FileNotFoundException: No content provider:仍然正常。请注意,消息级别不是错误,而是调试。这是Android播放器组件的行为方式:无论路径内容是什么,它首先将其作为本地资源进行尝试,如果失败,它将回退到远程资源。您可以在下一个Debug消息中看到:Couldn't open file on client side, trying server side。此时,图书馆被击中了。

如果视频无法播放,其他地方则出现问题。例如,在您的代码示例中,加密和解密(AES / ARC4)之间的密码不同。

答案 2 :(得分:0)

您可能还需要在解密端设置IVParameters,就像在初始化Cipher时在加密端所做的那样。

c.init(Cipher.DECRYPT_MODE,新的SecretKeySpec(“ BrianIsInTheKitchen” .getBytes(),“ ARC4”),新的IVParameterSpec(新的字节[16]));