2016-05-16 66 views
0

我能够成功记录音频并播放它。该文件正在存储在SD中,并具有如下所示的filePath:/storage/emulated/0/20160516_104008。问题是我希望用户能够通过图库小部件访问它。无法在Android中的图库文件夹中显示新添加的媒体

我研究这个问题,并使用MediaScannerConnection API,我已经实现了如下建议this后:

 MediaScannerConnection.scanFile(_reactContext, 
        new String[] { audioFileName }, null, 
        new MediaScannerConnection.OnScanCompletedListener() { 
       public void onScanCompleted(String path, Uri uri) { 
       } 
     }); 

下面是相关代码:

private boolean prepareAudioRecorder() { 
     audioRecorder = new MediaRecorder(); 
     audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     audioFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     audioFileName += "/" + timeStamp; 
     audioRecorder.setOutputFile(audioFileName); 
     audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     try { 
      audioRecorder.prepare(); 
      return true; 
     } catch (IOException e) { 
      Log.e(TAG, "prepare() failed"); 
      return false; 
     }   
    } 


public void stopAudioRecording(final Promise promise) { 

     if (audioRecorderPromise != null) { 
      audioFile = new File(audioFileName); 
      releaseAudioRecorder(); 
      storeFile(); 
      promise.resolve("finished recording"); 
     } else { 
      promise.resolve("not recording"); 
     } 

private void releaseAudioRecorder() { 
     if (audioRecorder != null) { 
      audioRecorder.stop(); 
      audioRecorder.release(); 
      audioRecorder = null; 
      if (audioRecorderPromise != null) { 
       // audioRecorderPromise.resolve(Uri.fromFile(audioFile).toString()); 
       audioRecorderPromise.resolve(audioFileName); 
       audioRecorderPromise = null; 
      } 
     }  
    } 

private void storeFile() { 

     values = new ContentValues(); 
     values.put(MediaStore.Audio.Media.TITLE, audioFileName); 
     values.put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis()); 
     values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 
     values.put(MediaStore.Audio.Media.DATA, audioFileName); 
     ContentResolver cr = _reactContext.getContentResolver(); 
     cr.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values); 
     Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Uri newUri = cr.insert(base, values); 
     Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);   
     intent.setData(Uri.fromFile(audioFile)); 
     _reactContext.sendBroadcast(intent);   
    } 

回答

-1

你不应该提供的文件名但绝对路径

请参阅Android Developers

更新更好地利用MediaScannerConnectionClient:

private MediaScannerConnectionClient mediaScannerConnectionClient = new MediaScannerConnectionClient() { 

    @Override 
    public void onMediaScannerConnected() { 
     mediaScannerConnection.scanFile("pathToFile/someName.extension", null); 
    } 

    @Override 
    public void onScanCompleted(String path, Uri uri) { 
     if(path.equals("pathToFile/someName.extension")) 
      mediaScannerConnection.disconnect(); 
    } 
}; 
MediaScannerConnection mediaScannerConnection = new MediaScannerConnection(context, mediaScannerConnectionClient).connect(); 
+1

'audioFilename'被定义为'Environment.getExternalStorageDirectory()getAbsolutePath();',并且与时间戳串联。那不是绝对路径吗? – Frosty619

+0

它应该是audioFile.getAbsolutePath() – John

+1

我试过这个,但它没有工作:没有错误被抛出,我仍然能够播放该文件,但无法在画廊中看到它 – Frosty619

相关问题