Я использую Android Lollipop и пытаюсь записать видео с MediaRecorder на внешнюю SD-карту, но ошибка открытия не удалась: EACCES (Permission denied).
Я прочитал самый популярный ответ на вопрос Какиспользовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)? там написано:
Если вы хотите получить доступ к этому Uri из собственного кода, вы можете вызвать ContentResolver.openFileDescriptor () изатем используйте ParcelFileDescriptor.getFd () или detachFd (), чтобы получить традиционное целое число дескриптора файла POSIX.
но я не понимаю, подходит ли это в моем случае и как его использовать
Я никогда не писал вопросы на stackoverflow.com, но на этот раз я очень устал ...
public class MainActivity extends AppCompatActivity {
private static String card = "sdcard1"; // NOT WORKING
//private static String card = "sdcard0"; // WORKING
// PATH TO VIDEO FILE
public static File Dir = new File("/storage/"+card+"/test");
static int REQUEST_CODE_STORAGE_ACCESS = 101;
protected MediaRecorder _rec;
private Surface _surface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
checkPermissions();
@SuppressLint("Recycle")
SurfaceTexture surfaceTexture = new SurfaceTexture(0);
_surface = new Surface(surfaceTexture);
if (!Dir.isDirectory()) if(Dir.mkdirs()) Log.i("MAIN", "Created DIR" + Dir.getAbsolutePath());
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra("android.content.extra.SHOW_ADVANCED",true);
startActivityForResult(intent, REQUEST_CODE_STORAGE_ACCESS);
}
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == REQUEST_CODE_STORAGE_ACCESS && resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {
startRecord();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
void startRecord() throws IOException, RuntimeException {
String fileName = Dir.getAbsolutePath() + "/" + DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime()) + ".mp4";
_rec = new MediaRecorder();
_rec.setAudioSource(MediaRecorder.AudioSource.MIC);
_rec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
_rec.setProfile(profile);
_rec.setOutputFile(fileName);
_rec.setPreviewDisplay(_surface);
_rec.prepare();
_rec.start();
}
private void checkPermissions() {
String[] actions = new String[]{
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.SEND_SMS,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECEIVE_BOOT_COMPLETED,
Manifest.permission.INTERNET
};
for (String a : actions) {
checkGrantPermission(a, actions);
}
}
private void checkGrantPermission(String action, String[] actions) {
int granted = ContextCompat.checkSelfPermission(this, action);
if (granted != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, actions, 1);
}
}
}