как получить путь к файлу в java / android, (getPath, альтернативный метод написанных методов приводит к сбою приложения) - PullRequest
0 голосов
/ 04 октября 2019

Пожалуйста, укажите надежный способ получения пути к файлу, который работает через API,

// извините за длинный вопрос.

Я пытаюсь сделать очень простое приложение, оноберет видео с устройства и затем сжимает его, для сжатия я использую библиотеку (fishwjy VideoCompressor), так как класс (VideoCompressingTask) из библиотеки требует путь к видео и путь назначения в его конструкторе, я пытаюсь передать видеопуть, используя метод (getPath (), он вызывает сбой приложения с недопустимым исключением аргумента, затем я использовал функцию из другого вопроса здесь, на сайте, чтобы получить путь, по которому он делает то же самое, я наконец-то попробовал функцию из класса (Util) изпроект библиотеки на github (Util.getFilePath ()), он очень хорошо работает с более низкими API (23), но с более высокими API (29,28) он вылетает с тем же исключением, я пытался позволить ему использовать (getPath()) на более высоких API, используйте getAbsulotePath () вместо этого также происходит сбой, что мне не хватает ?? что я делаю неправильно ???, любая помощь будетБудьте благодарны, заранее спасибо.

открытый класс MainActivity расширяет AppCompatActivity {

 Uri videoUri;
 static final int GET_VIDEO_REQUEST=64;
 private String outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
 String videoUriPath;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getVideoFromPhone();




}


void getVideoFromPhone(){
    Intent intent = new Intent();
    intent.setType("video/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent,GET_VIDEO_REQUEST);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==GET_VIDEO_REQUEST && resultCode==RESULT_OK){
        videoUri=data.getData();
        Toast.makeText(this, "Video added", Toast.LENGTH_SHORT).show();
        compressVideoForUpload();


    }
}

void compressVideoForUpload(){
    try{

        videoUriPath=Util.getFilePath(this,videoUri);
        String distinationDirectory=outputDir+File.separator+"out"+".mp4";


        VideoCompressTask task =VideoCompress.compressVideoLow(videoUri.getPath(), distinationDirectory, new VideoCompress.CompressListener() {
            @Override
            public void onStart() {
                Toast.makeText(MainActivity.this, "Compression started", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onSuccess() {
                Toast.makeText(MainActivity.this, " video Compressed : ", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onFail() {
                Toast.makeText(MainActivity.this, "Compression fail", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onProgress(float percent) {
                Toast.makeText(MainActivity.this, "Compressing :"+percent, Toast.LENGTH_LONG).show();
            }
        });
    }catch(Exception e){

        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();

    }



}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...