android - 如何通过颤动停止用户访问应用程序中的音频文件?
问题描述
在我的应用程序中有一些音频文件,我希望用户在购买和下载它们后收听它们,但不能复制这些文件。另一方面,我想限制用户只通过应用程序收听他们而不是与其他应用程序一起收听或复制他们自己的。我得到的唯一解决方案是在应用程序播放之前加密文件并解密它们。这个问题有什么标准方法吗?如果这是正确的解决方案,我应该如何实施?
谢谢。
解决方案
我用这种方式解决了这个问题,首先我将音频文件提取为字节,然后将数据作为字符串保存在新文件中,并带有我指定的扩展名。因此,当用户单击播放按钮时,响应函数会反转此过程,以便mp3
可以创建和使用文件。并且当用户在停止文件后单击停止按钮时,文件将被删除,这样任何人都无法拥有它。最后但并非最不重要的一点是,您必须将文件保存在 app 目录中,因为除非具有 root 访问权限,否则没有人可以访问它们,这是另一个障碍。这是我的实现:
import 'dart:io';
import 'dart:typed_data';
import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart';
class MediaFile {
Future<String> get docPath async {
Directory appDocDir = await getApplicationDocumentsDirectory();
return appDocDir.path;
}
Future<Uint8List> get audioFileData async {
final String path = await docPath;
final String theFilePath = '$path/test.mp3';
final File theFile = new File(theFilePath);
if (await theFile.exists()) {
return await theFile.readAsBytes();
} else {
File file = await FilePicker.getFile();
return await file.readAsBytes();
}
}
Future<String> dataToString() async {
Uint8List data = await audioFileData;
return new String.fromCharCodes(data);
}
Future<File> saveMediaAsString(String fileName, String fileContent) async {
String path = await docPath;
Directory dataDir = new Directory('$path/data');
if (await dataDir.exists()) {
File file = new File('$path/data/$fileName');
return file.writeAsString(fileContent);
}
await dataDir.create();
File file = new File('$path/data/$fileName');
return file.writeAsString(fileContent);
}
Future<String> readFromStringMediaFile(String fileName) async {
String path = await docPath;
File file = new File('$path/data/$fileName');
return file.readAsString();
}
Uint8List stringToData(dataStr) {
List<int> list = dataStr.codeUnits;
return new Uint8List.fromList(list);
}
Future<File> createAudioFile(String fileName, Uint8List bytes) async {
String path = await docPath;
File file = new File('$path/$fileName');
return await file.writeAsBytes(bytes);
}
//here you can see how to use them
Future<File> testFile() async {
String dataStr = await dataToString();
File savedFile = await saveMediaAsString('codedFile', dataStr);
String contentSavedFile = await readFromStringMediaFile('codedFile');
Uint8List bytes = stringToData(contentSavedFile);
return await createAudioFile('test.mp3', bytes);
}
}
这种方式的缺点是用户在播放音频文件时会遇到一点延迟,在用户单击播放按钮后显示加载是可以容忍的。
推荐阅读
- html - 可折叠表格在 IE 中不起作用,但在 Chrome 中起作用
- gradle - 没有有效的凭据(机制级别:找不到任何 kerberos tgt)TFS 2018
- airflow - 如果一项任务因触发规则 ALL_DONE 而失败,则 DAG 标记为“成功”
- azure-functions - 无法在 Azure 函数中运行 CSOM
- vba - vba 代码在 f8 中运行,但不在 f5 中
- javascript - 在客户端和 serviceWorker 之间传输数据
- c# - XmlDocument.LoadXml 是追加还是替换?
- angular - 从 EventEmitter 响应中检索数据 - 两个组件 Angular 之间的通信
- excel - VBA:我需要保存文件,但如果重复,请在文件名末尾执行序列“_1,_2,_3,...”
- swift - 在 Swift 中使用 partition 将一些预定义的元素移动到 Array 的末尾