我在服务器中有一个mp3文件,例如:www.example.com/Album/Songs/abc.mp3。
我正在构建一个Android应用程序,列出“Songs”文件夹下的所有文件,然后播放所选文件。
现在,有没有办法阻止直接访问mp3文件,如果有人拿到了URL?
我尝试了像重写引擎这样的常用方法。它会阻止直接URL访问,但它也会阻止我的应用程序使用这些文件。
这是我的Android代码来播放文件:
MediaPlayer player = new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource(song_path);
player.prepare();
player.start();
song_path只是http://www.example.com/Album/Songs/abc.mp3
PS:我知道通过ProGuard进行加密将使得通过逆向工程获得直接URL几乎是不可能的。我仍然想检查是否还有其他方法可以使它发挥作用。
答案 0 :(得分:1)
你的Android应用程序中没有任何关于它的事情。它是服务器方应采取的一项政策来防止这种情况发生。即使你准备你的APK还有像WireShark这样的应用程序可以嗅探你的应用程序并找到你正在调用的API。
有一些方法可以做到这一点。有些人尝试生成临时链接,只要应用程序(使用已登录的用户)调用说游戏API,他们就会提供应用程序临时链接,这将使稍后的一些小步(或小时)无效。然后应用程序使用该链接播放音乐或其他任何内容。
另一种情况是加密音乐字节并在应用程序端解密,这有更复杂的考虑。
答案 1 :(得分:1)
您可以使用player.setDataSource(Context context, Uri uri, Map<String, String> headers)
发送自定义header
。然后,您可以在返回mp3之前在PHP或Apache中检查该自定义标头。
要检入Apache,您可以使用rewrite rule
检查并仅允许与正确header
的连接。
在PHP中,您可以使用$_SERVER['HTTP_*YOUR_HEADER_HERE*']
然后使用echo
MP3文件以及正确的标题。如果你允许寻求,可能会有点棘手。
Apache rewrite rule
可能是最容易实现的。