如何从加密zip文件中传输音乐而不解压缩整个文件?

时间:2011-12-24 12:25:52

标签: android audio-streaming

我必须播放音频文件。这是在zip文件中,这是sdcard中的现有文件。并且音频文件已加密。因此,在解密音频时,我将获得输入流中的数据。

我不想解压缩,因为它会占用磁盘上的空间。

正如我调查的那样,如果我有流,我没有直接播放音频的线索。 它唯一可能通过网络。在这种情况下不是这样的。

所以我想的是产生一个线程,它会不断地将数据(字节)附加到文件中。当这开始时,我打电话给MediadPlayer开始工作。

媒体播放器运行良好。乐趣从这里开始:假设音频文件在6分钟 - 5MB。 缓冲可能发生在2MB。在搜索栏中,我可以看到2分钟作为我的最大持续时间。这是完全正确的。 当缓冲仍在继续..发生时,我想更新搜索栏中的时间及其长度(搜索条长度) 与给定时间成正比。我该怎么做呢。

我为此尝试了OnBufffering,它没有用。我猜它实际上是流媒体音频文件,如果它通过网络播放。

请给我一些简单的解决方案,如何完成这项工作?不要让我覆盖MediaPlayer课程并继续工作。

感谢任何帮助。如果您需要更清楚,请告诉我。

public class NotesAudDisplay extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl{
    private static final String TAG = "activity-NotesAudioDisplay";

    private String audioFilePath;
    private String notesFileName;
    private String mcfFileName;
    private String key;

    private SeekBar seekBarProgress;

    private NotesElement notesElement = null;
    private String notesTittle = "", notesHeading = "";
    private TextView heading_tv, playerStatus_tv;
    private QuesBuilder qb = null;

    private MediaPlayer mediaPlayer = null;
    private MediaController mediaController;

    private Drawable play_butt, pause_butt;
    private ProgressDialog pd;
    private Resources res = null;

    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audio_notesdisplay);

        res = getResources();
        play_butt = res.getDrawable(R.drawable.play);
        pause_butt = res.getDrawable(R.drawable.pause);

        heading_tv = (TextView) findViewById(R.id.notesHeading_tv);
        playerStatus_tv = (TextView) findViewById(R.id.playerStatus_tv);

        Intent intent = getIntent();
        notesTittle = intent.getStringExtra("notesTittle");
        notesFileName = intent.getStringExtra("notesFileName");
        mcfFileName = intent.getStringExtra("mcfFileName");
        key = intent.getStringExtra("key");

        TextView tittle_tv = (TextView) findViewById(R.id.notesTittle_tv);
        tittle_tv.setText(notesTittle);

        NotesXMLParser nxp = new NotesXMLParser(this, notesFileName,
                mcfFileName, key);
        nxp.OpenXmlDocument();
        notesElement = nxp.getNotesContent();
        Log.d("TAG", "notesele:" + notesElement);
        if (notesElement != null) {
            notesHeading = notesElement.getHeading();
            heading_tv.setText(notesHeading);

            QuesBuilderSet qbs = notesElement.getNotesStatement();
            ArrayList quesBuilder = qbs.getQuesBuilderSet();
            if (quesBuilder != null) {
                Log.d(TAG, " quesBuilder len:" + quesBuilder.size());
                for (int i = 0; i < quesBuilder.size(); i++) {
                    qb = (QuesBuilder) quesBuilder.get(i);
                    if (qb.getType() == QuesBuilder.SPEECH) {
                        Log.d(TAG, " AUDIO");

                        String file = qb.getQuesSpeech();
                        File f = createTmpAudioFile(file);

                        boolean decrypt_result = false;
                        if (f != null) {
                            new LongOperation().execute(f);
                            Log.d(TAG,"****before long operation****");
                            try {
                                Log.d(TAG,"****before thread operation****");
                                Thread.sleep(3000);
                                Log.d(TAG,"****after thread operation****");
                                setContent();

                            } catch (Exception e) {
                                Log.d("InstructionForm", "Sleep thread fails");
                            }
                            Log.d(TAG,"****after catch****");
                        } else {
                            heading_tv.setText(notesHeading
                                    + " Unable to play the audio.");
                        }

                    } else {
                        Log.d(TAG, " other:" + qb.getType());
                    }
                }
            }
        }
    }// onCreate

    public void setContent() {
        mediaController = new MediaController(NotesAudDisplay.this);
        mediaPlayer = new MediaPlayer();
        Log.d(TAG,"***GOING TO PREP STATE***");
        mediaPlayer.setOnPreparedListener(NotesAudDisplay.this);
        Log.d(TAG,"***DONE WITH PREP STATE***");
        try {
            mediaPlayer.setDataSource(audioFilePath);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.prepareAsync();
            mediaPlayer.start();
            playerStatus_tv.setText("Playing.. . ");
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private File createTmpAudioFile(String file) {
        DBAdapter dba = new DBAdapter(NotesAudDisplay.this);
        dba.open();
        String mobiDataPath = dba.get_mobidata_path();
        dba.close();
        audioFilePath = mobiDataPath + "/" + file;
        Log.d(TAG, "tmp audio filePath:" + audioFilePath);
        File f = null;
        try {
            f = new File(audioFilePath);
            return f;
        } catch (Exception e) {
            f = null;
            Log.d(TAG, " exception caught in creating audio file on sdcard");
        }
        return null;
    }

    private class LongOperation extends AsyncTask<File, Void, Boolean> {

        @Override
        protected void onPreExecute() {
            // TODO run small wheel
            // show_wheel();
        }

        @Override
        protected Boolean doInBackground(File... arg0) {
            DecryptZipReader dr = new DecryptZipReader();
            File f = arg0[0];
            Log.d(TAG, "*********copying start*********");
            boolean res = dr.getDecryptFileStream(NotesAudDisplay.this,
                    qb.getQuesSpeech(), mcfFileName, key, f);
            return new Boolean(res);
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // close_wheel();
            Log.d(TAG, "*********copying stop*********");

        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }

    }

    @Override
    protected void onStop() {
      super.onStop();
      mediaPlayer.stop();
      mediaPlayer.release();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
      //the MediaController will hide after 3 seconds - tap the screen to make it appear again
      mediaController.show(0);
      return false;
    }

    //--MediaPlayerControl methods----------------------------------------------------
    public void start() {
      mediaPlayer.start();
    }

    public void pause() {
      mediaPlayer.pause();
    }

    public int getDuration() {
      Log.d(TAG,"***duration:"+mediaPlayer.getDuration());
      return mediaPlayer.getDuration();
    }

    public int getCurrentPosition() {
      return mediaPlayer.getCurrentPosition();
    }

    public void seekTo(int i) {
      mediaPlayer.seekTo(i);
    }

    public boolean isPlaying() {
      return mediaPlayer.isPlaying();
    }

    public int getBufferPercentage() {
      return 0;
    }

    public boolean canPause() {
      return true;
    }

    public boolean canSeekBackward() {
      return true;
    }

    public boolean canSeekForward() {
      return true;
    }
    //--------------------------------------------------------------------------------

    public void onPrepared(MediaPlayer mediaPlayer) {
      Log.d(TAG, "*********onPrepared*********");
      mediaController.setMediaPlayer(this);
      mediaController.setAnchorView(findViewById(R.id.main_audio_view));

      handler.post(new Runnable() {
        public void run() {
          mediaController.setEnabled(true);
          mediaController.show(0);
        }
      });
    }
}

1 个答案:

答案 0 :(得分:1)

Afaik,您可以从zip中获取FileDescriptor,而无需使用Google的ZipResource库进行解压缩,它仅适用于扩展包,但如果您只是存储项目而不是压缩它,它可以正常工作(zip -r -n .mp3:.png:.txt命运原点)。

FileDescriptor已准备好与MediaPlayer一起使用,但如果加密可能有两个描述符可能会帮助您优化解密通量。

public ZipResourceFile getExpansionFiles(Context context){


 ZipResourceFile expansionFile = null;
try {
expansionFile = new ZipResourceFile(                                
    Environment.getExternalStorageDirectory() + "/MyFolder" + "/" + "/MyFile" + ".zip");

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}}

然后使用: ZipResourceFile z = getExpansionFiles(mContext);

AssetFileDescriptor afd = z.getAssetFileDescriptor(mItem +“。mp3”);

我希望它有所帮助,无论如何,你确定你不想等到文件被完全解密,然后播放它而不用担心所有这些即时头痛?