2016-05-20 8 views
0

Ich bin neu in Android und Java.setAudioSource in Android Studio Beispielcode fehlgeschlagen

ich die neueste Android Studio auf meinem Fenster mit 10.

Ich habe einfach eine leere Aktivität und klebte den Code aus

https://developer.android.com/guide/topics/media/audio-capture.html

meiner MainActivity.

Nach seinen Kommentaren fügte ich auch uses-permission in meinem Manifest hinzu.

Ich habe alle gelesen Q & Als glaube ich, das Manifest ist gut.

Allerdings bekomme ich immer SetAudioSource mit dem Callstack am Ende des Posts fehlgeschlagen.

Der Fehler ist auf meinem Nexus 5 und meinem Nexus 5 Virtual Gerät identisch.

Können Sie mir bitte helfen? Vielen Dank!

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.kyang.myapplication"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

    <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> 
</manifest> 

Mein Code ist unten:

package com.example.kyang.myapplication; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.app.Activity; 
import android.widget.LinearLayout; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.content.Context; 
import android.util.Log; 
import android.media.MediaRecorder; 
import android.media.MediaPlayer; 

import java.io.IOException; 

public class MainActivity extends Activity { 

    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); 
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      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 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.3gp"; 
    } 


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

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

    @Override 
    protected 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); 
    } 
} 

Ausgabe im Android-Monitor Verbose-Modus:

05-20 09:34:18.552 15335-15335/com.example.kyang.myapplication I/Process: Sending signal. PID: 15335 SIG: 9 
05-20 09:35:07.850 16251-16251/com.example.kyang.myapplication W/ActivityThread: Application com.example.kyang.myapplication is waiting for the debugger on port 8100... 
05-20 09:35:07.854 16251-16251/com.example.kyang.myapplication I/System.out: Sending WAIT chunk 
05-20 09:35:08.273 16251-16257/com.example.kyang.myapplication I/art: Debugger is active 
05-20 09:35:08.468 16251-16251/com.example.kyang.myapplication I/System.out: Debugger has connected 
05-20 09:35:08.468 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:08.669 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:08.872 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:09.086 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:09.287 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:09.488 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:09.690 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:09.891 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:10.092 16251-16251/com.example.kyang.myapplication I/System.out: waiting for debugger to settle... 
05-20 09:35:10.293 16251-16251/com.example.kyang.myapplication I/System.out: debugger has settled (1377) 
05-20 09:35:10.310 16251-16251/com.example.kyang.myapplication W/System: ClassLoader referenced unknown path: /data/app/com.example.kyang.myapplication-2/lib/x86_64 
05-20 09:35:10.571 16251-16251/com.example.kyang.myapplication W/System: ClassLoader referenced unknown path: /data/app/com.example.kyang.myapplication-2/lib/x86_64 
05-20 09:35:10.883 16251-16304/com.example.kyang.myapplication D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                       [ 05-20 09:35:10.893 16251:16251 D/   ] 
                       HostConnection::get() New Host Connection established 0x7fdfb5ffea40, tid 16251 


                       [ 05-20 09:35:10.940 16251:16304 D/   ] 
                       HostConnection::get() New Host Connection established 0x7fdfb9ac6400, tid 16304 
05-20 09:35:10.976 16251-16304/com.example.kyang.myapplication I/OpenGLRenderer: Initialized EGL, version 1.4 
05-20 09:35:12.406 16251-16251/com.example.kyang.myapplication D/AndroidRuntime: Shutting down VM 


                       --------- beginning of crash 
05-20 09:35:12.410 16251-16251/com.example.kyang.myapplication E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.example.kyang.myapplication, PID: 16251 
                       java.lang.RuntimeException: setAudioSource failed. 
                        at android.media.MediaRecorder.setAudioSource(Native Method) 
                        at com.example.kyang.myapplication.MainActivity.startRecording(MainActivity.java:65) 
                        at com.example.kyang.myapplication.MainActivity.onRecord(MainActivity.java:33) 
                        at com.example.kyang.myapplication.MainActivity.access$000(MainActivity.java:20) 
                        at com.example.kyang.myapplication.MainActivity$RecordButton$1.onClick(MainActivity.java:90) 
                        at android.view.View.performClick(View.java:5198) 
                        at android.view.View$PerformClick.run(View.java:21147) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

können Sie den gesamten Stack-Trace nicht nur die einzige Linie Post geschrieben Sie –

+0

Dank! Ich habe gerade die gesamte Stack-Spur hinzugefügt. Sobald ich auf "Aufzeichnung starten" klicke, wird der obige Aufrufstapel beendet. – ykcadcg

+0

bist du sicher das ist es? es sollte mehr mit ein paar Zeilen geben, die durch –

Antwort

2

Ja, gibt es! Sie können requestPermissions() von Ihrer Aktivität oder Ihrem Fragment aufrufen. Dieses Beispiel passt für einen Anruf von einer Aktivität

int YOUR_REQUEST_CODE = 200; // could be something else.. 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) //check if permission request is necessary 
{ 
    ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, YOUR_REQUEST_CODE}); 
} 

Dann können Sie in onRequestPermissionResult überprüfen, ob die Erlaubnis erteilt wurde:

@Override 
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     if(requestCode == YOUR_REQUEST_CODE) 
     { 
      Log.i(TAG, "Permission granted"); 
      //do what you wanted to do 
     } 
    } else { 
     Log.d(TAG, "Permission failed"); 
    } 
} 

Für eine gute Praxis, sollten Sie überprüfen, ob eine Genehmigung bereits erteilt worden ist (um zu vermeiden ärgerlich der Benutzer jedes Mal fragen, ..)

if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(getApplicationContext(),permissionString)) 
0

Schließlich fand ich zu Stell- gehen müssen> App-> Permission-> slide auf dem Mikrofon und Speicher manuell. Warum habe ich nichts gefunden, was das erwähnt?

Gibt es eine Möglichkeit, den Benutzer explizit dazu auffordern, diese Berechtigungen zu erteilen, anstatt stumm mit den Einstellungen zu stürzen, die so tief im Telefon verborgen sind ??

Verwandte Themen