Android 为什么我的录音机能在三星手机上工作,而Nexus手机不能?

Android 为什么我的录音机能在三星手机上工作,而Nexus手机不能?,android,android-studio,audio-recording,Android,Android Studio,Audio Recording,我正在尝试录制音频并将其保存在新文件夹中。在三星设备中,它可以工作,但在Nexus手机中,它会出现一些错误。我有两个错误:一个在我的公共类的第一行,第二个在startRecording()行。这是我的密码: MainActivity.java: public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) {

我正在尝试录制音频并将其保存在新文件夹中。在三星设备中,它可以工作,但在Nexus手机中,它会出现一些错误。我有两个错误:一个在我的公共类的第一行,第二个在
startRecording()
行。这是我的密码:

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

         mRecordBtn.setOnTouchListener(new View.OnTouchListener()
         {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent)
            {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

                    startRecording();       //<<<<<<<<<<<<<<<<HERE AN ERROR
                    mRecordLabel.setText("GRAVANDO");
                    adp.notifyDataSetChanged();


                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

                    stopRecording();
                    mRecordLabel.setText("GRAVADO");

                    lv.setAdapter(adp);
                    adp.notifyDataSetChanged();
                }

                return false;
            }
         });
         ...
    }

    private void startRecording()
    {

    Long tsLong = System.currentTimeMillis()/1000;
    String ts = tsLong.toString();
    mRecorder = new MediaRecorder();
    mRecorder.reset();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    mRecorder.setOutputFile(mFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    String sep = File.separator; // Use this instead of hardcoding the "/"
    String newFolder = "FolderName";
    String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
    File myNewFolder = new File(extStorageDirectory + sep + newFolder);
    //myNewFolder.mkdir();
    myNewFolder.mkdirs();

    mFileName = Environment.getExternalStorageDirectory().toString()
            + sep + newFolder + sep + "Record."+ts+".mp3";
    ...
    }
...
}
显示

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.usr.usr.musicplayer">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />


<application
    android:allowBackup="true"
    android:icon="@drawable/llama10"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/PlayerTheme">
    <activity android:name=".MainActivity"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Player"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
    </activity>
</application>


这不是设备问题。这是一个API版本问题。您必须找出哪个API版本正在崩溃,然后您应该能够通过很少的研究缩小您的问题。

鉴于您的目标是API 24,并且假设您支持API 16及更高版本,您必须在运行时请求对读取外部存储、写入外部存储的权限(我认为最后一个包括读和写,但为了安全起见,我列出了这两个方面),并录制音频,因为这些被认为是危险的权限

您必须在开始录制之前执行此操作,如果用户在应用程序请求权限时未提供权限,或者在之前提供了权限后撤销了权限,则应用程序必须处理

它的实施相当复杂,包括:

  • 检查您是否有权限授权
  • 如果没有,请检查用户是否声明不再询问
  • 检查您是否应该解释应用程序为什么需要这些权限
  • 如果您发现您没有帮助签出本教程

    在这4行之后,堆栈跟踪是否还有其他内容?您是否正在请求使用麦克风的权限(在清单和运行时)?就这些行,我把录制音频的权限放在manifest@JuanCan你可以发布你的manifest来查看你正在编译的sdk吗?如果你的目标sdk是23或更高,你必须在运行时请求权限。我用manifest@Juan更新它,我的目标是24我的版本是24,所以我需要使用一个旧的?我现在开始,s很难。谢谢你的回答@grant
     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.usr.usr.musicplayer">
    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/llama10"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/PlayerTheme">
        <activity android:name=".MainActivity"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Player"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
        </activity>
    </application>