MediaRecorder не может записывать на внешнюю SD-карту - PullRequest
0 голосов
/ 24 апреля 2019

Я использую 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);
        }
    }

}
...