2016-10-25 6 views
0

이것은 내 코드이며 실제로 Google Developer Android Guide의 코드입니다. 그러나이 코드는 "java.lang.RuntimeException : setAudioSource"오류가 발생했습니다. " 모든 솔루션을 시도했지만 여전히 오류가 발생합니다.java.lang.RuntimeException : setAudioSource failed Google 가이드 코드가 오류를 던지고 있습니다

private static final String LOG_TAG = "AudioRecordTest"; 
private static String mFileName = null; 

private RecordButton mRecordButton = null; 
private MediaRecorder mRecorder = null; 

private PlayButton mPlayButton = null; 
private MediaPlayer mPlayer = null; 

private void onRecord(boolean start) { 
    if (start) { 
     startRecording(); 
    } else { 
     stopRecording(); 
    } 
} 

private void onPlay(boolean start) { 
    if (start) { 
     startPlaying(); 
    } else { 
     stopPlaying(); 
    } 
} 

private void startPlaying() { 
    mPlayer = new MediaPlayer(); 
    try { 
     mPlayer.setDataSource(mFileName); 
     mPlayer.prepare(); 
     mPlayer.start(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 
} 

private void stopPlaying() { 
    mPlayer.release(); 
    mPlayer = null; 
} 

private void startRecording() { 
    mRecorder = new MediaRecorder(); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // This row is throwing error. 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

    try { 
     mRecorder.prepare(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "prepare() failed"); 
    } 

    mRecorder.start(); 
} 

private void stopRecording() { 
    mRecorder.stop(); 
    mRecorder.release(); 
    mRecorder = null; 
} 

class RecordButton extends Button { 
    boolean mStartRecording = true; 

    OnClickListener clicker = new OnClickListener() { 
     public void onClick(View v) { 
      onRecord(mStartRecording); 
      if (mStartRecording) { 
       setText("Stop recording"); 
      } else { 
       setText("Start recording"); 
      } 
      mStartRecording = !mStartRecording; 
     } 
    }; 

    public RecordButton(Context ctx) { 
     super(ctx); 
     setText("Start recording"); 
     setOnClickListener(clicker); 
    } 
} 

class PlayButton extends Button { 
    boolean mStartPlaying = true; 

    OnClickListener clicker = new View.OnClickListener() { 
     public void onClick(View v) { 
      onPlay(mStartPlaying); 
      if (mStartPlaying) { 
       setText("Stop playing"); 
      } else { 
       setText("Start playing"); 
      } 
      mStartPlaying = !mStartPlaying; 
     } 
    }; 

    public PlayButton(Context ctx) { 
     super(ctx); 
     setText("Start playing"); 
     setOnClickListener(clicker); 
    } 
} 

public MainActivity() { 
    mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    mFileName += "/audiorecordtest.mp4"; 
} 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    LinearLayout ll = new LinearLayout(this); 
    mRecordButton = new RecordButton(this); 
    ll.addView(mRecordButton, 
      new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        0)); 
    mPlayButton = new PlayButton(this); 
    ll.addView(mPlayButton, 
      new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        0)); 
    setContentView(ll); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    if (mRecorder != null) { 
     mRecorder.release(); 
     mRecorder = null; 
    } 

    if (mPlayer != null) { 
     mPlayer.release(); 
     mPlayer = null; 
    } 
} 

}

이 내 안드로이드 매니페스트

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

의 PLS 도움이됩니다. 나는 3 일 동안 문제를 해결하려고 노력하고있다.

답변

0

이 문제가 해결되었습니다. 안드로이드 권한의 사용은 안드로이드 6.0 후에 변경됩니다. 이 메서드를 내 대구 추가했습니다 :

private boolean Permissions(){ 
     int permissionWRITE_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     int permissionRECORD = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO); 
     List<String> listPermissionsNeeded = new ArrayList<>(); 

     if (permissionWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     } 
     if (permissionRECORD != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(android.Manifest.permission.RECORD_AUDIO); 
     } 

     if (!listPermissionsNeeded.isEmpty()) { 
      ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
      return false; 
     } 

     return true; 


    } 

그리고 내 onCreate 메서드에서이 메서드를 사용하십시오.

if (!Permissions()) { 
      return; 
     }