下载时加密音频mp3文件,并在android中播放时解密

时间:2019-10-24 10:22:37

标签: java audio encryption download mp3

我有一个android应用程序,可以下载和播放mp3文件。但是我想在下载时加密音频文件,然后解密以播放它。我已经检查了互联网上的所有地方,但没有找到任何解决方案。谁能帮我下载时加密音频文件,然后在播放时解密 这是我下载文件的代码

function dfs(o, target){
    if(o.value == target) return [target];
    if(!o.children) return false;
    let path;
    o.children.find(x=>path=dfs(x, target));
    if(path){
        return [o.value].concat(path);
    }
};

const opts = [
    {
        value: '01',
        children: [
            { value: '0198' },
            { value: '0195', children: [{ value: '09977' }] }
        ]
    },
    {
        value: '02',
        children: [
            { value: '01986' },
            {
                value: '0195',
                children: [
                    { value: '09978', children: [{ value: '09864' }, { value: '90876' }] }
                ]
            }
        ]
    }
];

let path;
opts.find(x=>path=dfs(x, '90876'))
console.log(path);

所以您能帮我提供代码吗?

1 个答案:

答案 0 :(得分:0)

我找到了我的问题的解决方案,并且已经在我的应用程序中使用它很多天没有任何问题,所以我认为回答我自己的问题也很好,因为许多用户在评论中要求解决方案。所以只需按照以下代码-

  //Downloading and encrypting the audio

  AesCipherDataSink encryptingDataSink = new AesCipherDataSink(
      Util.getUtf8Bytes("4J95qN8RxBP8hTpk"),
      new DataSink() {
       private FileOutputStream fileOutputStream;

       @Override
       public void open(DataSpec dataSpec) throws IOException {
               fileOutputStream = new FileOutputStream(file);
        }

       @Override
       public void write(byte[] buffer, int offset, int length) throws IOException {
          fileOutputStream.write(buffer, offset, length);
        }

       @Override
       public void close() throws IOException {
             fileOutputStream.close();
         }
        });

   // Push the data through the sink, and close everything.
   encryptingDataSink.open(new DataSpec(Uri.fromFile(file)));
   URL downloadURL = new URL(strings[0]);
   HttpURLConnection connection = (HttpURLConnection) downloadURL.openConnection();
   connection.setChunkedStreamingMode(0);
   connection.setDoInput(true);
   connection.connect();
   if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
      return "Server error";
   }

   InputStream inputStream = connection.getInputStream();
   byte[] buffer = new byte[1024];
   int newLength;
   while ((newLength = inputStream.read(buffer)) > 0) {
        encryptingDataSink.write(buffer, 0, newLength);
    }
   encryptingDataSink.close();
   inputStream.close();



   //decrypting and playing the audio
   DataSource.Factory factory =
                new CustomDataSourceFactory(
                        context,
                        new OkHttpDataSourceFactory(new OkHttpClient(), Util.getUserAgent(context,
                              context.getResources().getString(R.string.app_name)))
                );

    MediaSource videoSource =
                new ProgressiveMediaSource.Factory(factory)
                        .createMediaSource(Uri.parse(tempFile.getAbsolutePath()));
    exoPlayer.addMediaSource(videoSource);

    
   //CustomDataSourceFactoryClass

    public class CustomDataSourceFactory implements DataSource.Factory {

      private final Context context;
      private final DataSource.Factory baseDataSourceFactory;


      public CustomDataSourceFactory(Context context, DataSource.Factory baseDataSourceFactory) {
        this.context = context.getApplicationContext();
        this.baseDataSourceFactory = baseDataSourceFactory;
       }

       @Override
        public DataSource createDataSource() {
         return new CryptedDefaultDataSource(context, baseDataSourceFactory.createDataSource());
         }
      }

   //CryptedDafaultDataSource
    public class CryptedDefaultDataSource implements DataSource {

      private final List<TransferListener> transferListeners;
      private final DataSource baseDataSource;
      private @Nullable
      DataSource fileDataSource,aesCipherDataSource,dataSource;
      private Context context;

      CryptedDefaultDataSource(Context context, DataSource baseDataSource) {
         this.context=context;
         this.baseDataSource = Assertions.checkNotNull(baseDataSource);
         transferListeners = new ArrayList<>();
      }

      @Override
      public void addTransferListener(TransferListener transferListener) {
       baseDataSource.addTransferListener(transferListener);
       transferListeners.add(transferListener);
       maybeAddListenerToDataSource(fileDataSource, transferListener);
       maybeAddListenerToDataSource(aesCipherDataSource, transferListener);
      }

     @Override
     public long open(DataSpec dataSpec) throws IOException {
        Assertions.checkState(dataSource == null);
        if (Util.isLocalFileUri(dataSpec.uri)) {
          dataSource = getCryptedDataSource(getFileDataSource());
        } else {
          dataSource = getCryptedDataSource(baseDataSource);
        }
       return dataSource.open(dataSpec);
      }

     @Override
      public int read(byte[] buffer, int offset, int readLength) throws IOException {
         return Assertions.checkNotNull(dataSource).read(buffer, offset, readLength);
       }

      @Nullable
      @Override
       public Uri getUri() {
        return dataSource == null ? null : dataSource.getUri();
      }

      @Override
      public Map<String, List<String>> getResponseHeaders() {
          return dataSource == null
            ? DataSource.super.getResponseHeaders()
            : dataSource.getResponseHeaders();
       }

     @Override
     public void close() throws IOException {
       if (dataSource != null) {
        try {
            dataSource.close();
        } finally {
            dataSource = null;
        }
      }
     }

    private DataSource getFileDataSource() {
      if (fileDataSource == null) {
         fileDataSource = new FileDataSource();
         addListenersToDataSource(fileDataSource);
       }
       return fileDataSource;
     }

    private DataSource getCryptedDataSource(DataSource upstreamDataSource) {
      if (aesCipherDataSource == null) {
        aesCipherDataSource = new AesCipherDataSource("4J95qN8RxBP8hTpk".getBytes(),upstreamDataSource);
        addListenersToDataSource(aesCipherDataSource);
      }
      return aesCipherDataSource;
     }

   private void addListenersToDataSource(DataSource dataSource) {
     for (int i = 0; i < transferListeners.size(); i++) {
        dataSource.addTransferListener(transferListeners.get(i));
     }
   }

     private void maybeAddListenerToDataSource(
        @Nullable DataSource dataSource, TransferListener listener) {
      if (dataSource != null) {
        dataSource.addTransferListener(listener);
      }
     }
   }