Пожалуйста, укажите надежный способ получения пути к файлу, который работает через 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);
}
}