如何在java/android中获取文件路径(getPath,替代编写方法导致应用程序崩溃)

如何在java/android中获取文件路径(getPath,替代编写方法导致应用程序崩溃),java,android,illegalargumentexception,Java,Android,Illegalargumentexception,请展示一种可跨API获取文件路径的可靠方法 //很抱歉问了这么长的问题 我正在尝试制作一个非常简单的应用程序,它从设备中获取一个视频,然后对其进行压缩,对于压缩,我使用(fishwjy VideoCompressor)库,因为库中的类(VideoCompressingTask)需要视频的路径及其构造器中的目标路径,我尝试使用(getPath()传递视频路径方法它使用非法参数异常使应用程序崩溃,然后我使用了来自站点上另一个问题的函数来获取路径,它也执行相同的操作,最后我尝试了github上库项目的

请展示一种可跨API获取文件路径的可靠方法

//很抱歉问了这么长的问题

我正在尝试制作一个非常简单的应用程序,它从设备中获取一个视频,然后对其进行压缩,对于压缩,我使用(fishwjy VideoCompressor)库,因为库中的类(VideoCompressingTask)需要视频的路径及其构造器中的目标路径,我尝试使用(getPath()传递视频路径方法它使用非法参数异常使应用程序崩溃,然后我使用了来自站点上另一个问题的函数来获取路径,它也执行相同的操作,最后我尝试了github上库项目的(Util)类中的一个函数(Util.getFilePath()),它在较低的API(23)中工作得很好,但在较高的API(29,28)中工作得很好它崩溃时也有同样的例外,我试图让它在更高的API中使用(getPath()),使用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);
}

}

您可以使用Intent.ACTION\u GET\u CONTENT获取uri,然后获取uri.getPath()。但是,您没有经典文件的路径。最好使用文件选择器,该选择器提供文件的真实路径。如果要继续操作,请首先将获取的uri的内容复制到经典文件,然后使用该文件的路径。简言之,请先进行复制。请编辑您的帖子,使代码位于一个块中。很抱歉代码在不同的块中,我编辑了它,希望我能尝试你的答案。我试图从我拥有的uri创建一个文件,然后引用它的路径,如果这是你的意思,我使用{file file file=new file(videoUri.getPath)}然后在构造函数中使用创建的文件路径,但它也不起作用,请告诉我一个更好的方法,我想继续使用Intent.ACTION\u GET\u CONTENT。作为新文件()这是完全错误的根本不创建文件。而且那个路径是无用的。我建议你先用谷歌搜索一个普通的复制文件功能。然后我们可以使用内容方案来调整它。