为什么我的 Audio_Recorder 在 Samsung 可以用,而 Nexus phone 不能用?
Why my Audio_Recorder works in Samsung but Nexus phone not?
我正在尝试录制音频并将其保存在新文件夹中。在 Samsung 设备中,它可以正常工作,但在 Nexus phone 中它会出现一些错误。我收到两个错误:一个在 public class 的第一行,第二个在 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";
...
}
...
}
这是来自 logcat 的错误:
java.lang.RuntimeException: setAudioSource failed.
at org.usr.usr.musicplayer.MainActivity.startRecording(MainActivity.java:222) = mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
at org.usr.usr.musicplayer.MainActivity.access[=13=]0(MainActivity.java:72) = public class MainActivity extends AppCompatActivity {
at org.usr.usr.musicplayer.MainActivity.onTouch(MainActivity.java:196) = startRecording();
清单
<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 及更高版本,您将必须在运行时为 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 请求许可(我认为最后一个涵盖了读和写,但我将两者都列出来是为了安全起见)和 RECORD_AUDIO 因为这些被认为是危险的权限。
您必须在开始录制之前执行此操作,并且如果用户在应用程序请求权限时未提供权限,或者在一段时间前提供权限后撤销权限,则应用程序必须处理。
实现起来比较复杂,涉及:
- 检查您是否有权限授予。
- 如果没有,检查用户是否声明不再询问
- 检查您是否应该提供一些关于为什么应用程序需要这些权限的解释。
如果您发现 没有帮助,请查看本教程
Android 6.0 Runtime Permissions a CommonsWare Code Lab
我正在尝试录制音频并将其保存在新文件夹中。在 Samsung 设备中,它可以正常工作,但在 Nexus phone 中它会出现一些错误。我收到两个错误:一个在 public class 的第一行,第二个在 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";
...
}
...
}
这是来自 logcat 的错误:
java.lang.RuntimeException: setAudioSource failed.
at org.usr.usr.musicplayer.MainActivity.startRecording(MainActivity.java:222) = mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
at org.usr.usr.musicplayer.MainActivity.access[=13=]0(MainActivity.java:72) = public class MainActivity extends AppCompatActivity {
at org.usr.usr.musicplayer.MainActivity.onTouch(MainActivity.java:196) = startRecording();
清单
<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 及更高版本,您将必须在运行时为 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 请求许可(我认为最后一个涵盖了读和写,但我将两者都列出来是为了安全起见)和 RECORD_AUDIO 因为这些被认为是危险的权限。
您必须在开始录制之前执行此操作,并且如果用户在应用程序请求权限时未提供权限,或者在一段时间前提供权限后撤销权限,则应用程序必须处理。
实现起来比较复杂,涉及:
- 检查您是否有权限授予。
- 如果没有,检查用户是否声明不再询问
- 检查您是否应该提供一些关于为什么应用程序需要这些权限的解释。
如果您发现