将通知声音设置为用户录制的文件?android.os.FileUriExposedException
将通知声音设置为用户录制的文件?android.os.FileUriExposedException
在我的应用程序中,我使用MediaRecorder记录和保存文件。然后,当发送通知时,我想播放我录制的音频文件。当我将声音设置为文件位置的URI时,应用程序崩溃。
下面是音频记录器,当我使用MediaPlayer播放时,它工作得很好,并且声音也很棒(此代码适用于显示文件保存位置的位置):
//每次录制时文件名都是唯一的,但为了在线上目的,它被简化了。 _audioFilename = f.getAbsolutePath() + "/voice.3gp"; mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mRecorder.setAudioEncodingBitRate(133333); mRecorder.setAudioSamplingRate(44100); mRecorder.setOutputFile(_audioFilename); mRecorder.setMaxDuration(10000);
然后,稍后调用通知时:
//在这里获取文件名并添加文件://前缀 //我也尝试添加content://前缀 Uri audioUri = Uri.parse("file://" + task.getAudio()); //为较新的构建SDK创建通知通道。 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { /* 创建一个MyNotification通道 */ AudioAttributes audioAtts = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) .setUsage(AudioAttributes.USAGE_NOTIFICATION) .build(); String channelId = "myNotification"; CharSequence channelName = "Some Channel"; int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance); notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.BLUE); notificationChannel.enableVibration(true); notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}); notificationChannel.setSound(audioUri, audioAtts); notifManager.createNotificationChannel(notificationChannel); } //在这里构建通知并添加声音(如果SDK较旧)。 nb = new NotificationCompat.Builder(c, "myNotification") .setLargeIcon(BitmapFactory.decodeResource(c.getResources(), R.mipmap.ic_launcher)) .setSmallIcon(R.mipmap.proxi_icon_round) .setContentTitle("ProxiAlert:您在"+task.getTask()+"附近的位置为"+task.getAddress()) .setContentText("任务描述:"+task.getDescription()) .setStyle(new NotificationCompat.BigTextStyle() .bigText("任务描述:"+task.getDescription())) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400}) //程序在此处崩溃,抛出FileUriExposedException异常 .setSound(audioUri);
如何解决这个问题?我需要将通知声音保存为铃声吗?文件必须存储在其他位置以便通知访问它吗?还有其他解决方法(除了使用MediaPlayer)吗?