首页 > 解决方案 > 如何通过颤动停止用户访问应用程序中的音频文件?

问题描述

在我的应用程序中有一些音频文件,我希望用户在购买和下载它们后收听它们,但不能复制这些文件。另一方面,我想限制用户只通过应用程序收听他们而不是与其他应用程序一起收听或复制他们自己的。我得到的唯一解决方案是在应用程序播放之前加密文件并解密它们。这个问题有什么标准方法吗?如果这是正确的解决方案,我应该如何实施?

谢谢。

标签: androidiosflutter

解决方案


我用这种方式解决了这个问题,首先我将音频文件提取为字节,然后将数据作为字符串保存在新文件中,并带有我指定的扩展名。因此,当用户单击播放按钮时,响应函数会反转此过程,以便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);
  }
}

这种方式的缺点是用户在播放音频文件时会遇到一点延迟,在用户单击播放按钮后显示加载是可以容忍的。


推荐阅读