¿Cómo puedo transmitir música desde un archivo dentro de un archivo zip cifrado sin descomprimir todo el archivo?

Tengo que reproducir el archivo de audio. Que está en el archivo zip, que es el presente en sdcard. Y el archivo de audio está encriptado. Así que mientras descifrar el audio, voy a obtener los datos en el inputtream.

No quiero descomprimir porque se come espacio en el disco.

Como he investigado no obtuve pistas sobre cómo reproducir audio directamente si tengo stream. Sólo es posible a través de la red. Lo que no es en este caso.

Así que lo que pensé es generar un hilo que mantendrá anexando datos (bytes) al archivo. Como esto comienza, estoy llamando MediadPlayer para comenzar su trabajo.

Media Player hace bien. Fun comienza aquí: Supongamos que si el archivo de audio en 6min – 5MB. El almacenamiento en búfer puede haber ocurrido durante 2 MB. En la barra de búsqueda que puedo ver por 2min como mi duración máxima. Esto es perfectamente correcto. Cuando el almacenamiento en búfer sigue siendo .. sucediendo, quiero actualizar el tiempo en la barra de búsqueda y su longitud (Seek barra de longitud) es directamente proporcional para el tiempo dado. ¿Cómo voy sobre esto.

Intenté OnBufffering para esto, no funcionó. Supongo que en realidad es para streaming de archivos de audio, si se reproduce a través de una red.

Por favor, dame una solución sencilla, ¿cómo hacer esto? No me pida que anule la clase MediaPlayer y trabaje en ella.

Cualquier ayuda es apreciada. Déjeme saber si usted necesita más claridad en esto.

 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, usted podría tomar un FileDescriptor de un cierre relámpago sin extraer usar la biblioteca de ZipResource de Google, se piensa para los paquetes de la extensión solamente, pero funciona perfectamente si usted apenas almacena los artículos y no lo comprime (zip -r -n .mp3: .png: .txt destino origen).

FileDescriptor está listo para usar con MediaPlayer, pero si su encriptado tal vez tener dos descriptores podría ayudarle a optimizar el flujo de desencriptación.

 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(); }} 

Entonces utilice: ZipResourceFile z = getExpansionFiles (mContext);

AssetFileDescriptor afd = z.getAssetFileDescriptor (mItem + ". Mp3");

Espero que ayude, de todos modos, ¿estás seguro de que no quieres esperar hasta que el archivo sea completamente descifrado, y luego reproducirlo sin preocuparte por todo este dolor de cabeza inmediato?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.