我有基本应用程序,可以使用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)
答案 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]));