Как я могу передавать музыку из файла внутри зашифрованного zip без распаковки всего файла?

Мне нужно воспроизвести аудиофайл. Что находится в zip-файле, который присутствует в sdcard. И аудиофайл зашифрован. Поэтому, расшифровывая звук, я получаю данные во входном потоке.

Я не хочу разархивировать, потому что он ест пространство на диске.

Поскольку я исследовал, у меня не было информации о том, как воспроизводить аудио напрямую, если у меня есть поток. Его единственная возможная сеть. Что не в этом случае.

Так что я думал, чтобы порождать поток, который будет хранить добавление данных (байтов) в файл. Когда это начинается, я звоню в MediadPlayer чтобы начать работу.

Медиаплеер отлично справляется. Fun начинается здесь: Предположим, что аудиофайл в 6мин – 5 МБ. Буферизация может произойти за 2 МБ. В строке поиска я могу видеть в течение 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); } }); } } 

Afaik, вы можете взять FileDescriptor из zip без извлечения с использованием библиотеки ZipResource из Google, он предназначен только для пакетов расширения, но он отлично работает, если вы просто храните элементы и не сжимаете их (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");

Надеюсь, это поможет, так или иначе, вы уверены, что не хотите ждать, пока файл будет полностью дешифрован, а затем сыграйте в него, не беспокоясь обо всем этом на лету головной боли?