首页 > 解决方案 > 如何将文件从文件选择器传递给函数?

问题描述

我有一个打开文件选择器的应用程序,它在 Toast 消息中输出该文件的路径。但我想更改它,以便我选择的文件作为参数传递给函数。

我的活动如下所示:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.btn_picker);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("*/*");
            startActivityForResult(intent, 7);
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub

    switch (requestCode) {
        case 7:
            if (resultCode == RESULT_OK) {
                String PathHolder = data.getData().getPath();
                Toast.makeText(MainActivity.this, "The Files path is: "+ PathHolder, Toast.LENGTH_LONG).show();
            }
            break;
    }
}
}

它做了它应该做的事情,但不是输出文件路径,而是我想调用该函数

 importToFile()

从管理类。

我想做这样的事情:

manage.importToFile(File1)

其中 File1 是我从文件选择器中选择的文件。

我怎样才能做到这一点。

提前致谢。

标签: javaandroid

解决方案


您可以在 android 中使用File类来处理文件。创建一个File使用所选文件路径的实例并将其传递给您的该方法。像这样的东西:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub

    switch (requestCode) {
        case 7:
            if (resultCode == RESULT_OK) {
                // as @Taseer Ahmad said its not a good way to get path of the file.
                //String PathHolder = data.getData().getPath();
                String PathHolder = getPath(this, data.getData());
                if (!TextUtils.isEmpty(PathHolder)) {
                    File file = new File(PathHolder);
                    manager.importToFile(file);
                    Toast.makeText(MainActivity.this, "The Files path is: "+ PathHolder, Toast.LENGTH_LONG).show();
                }
            }
            break;
    }
}

编辑
正如@Taseer Ahmad 所说,data.getData().getPath()不是获取所选文件路径的安全方法。这段代码是从这里复制的。

public static String getPath(Context context, Uri uri) throws URISyntaxException {
    if ("content".equalsIgnoreCase(uri.getScheme())) {
        String[] projection = { "_data" };
        Cursor cursor = null;

        try {
            cursor = context.getContentResolver().query(uri, projection, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow("_data");
            if (cursor.moveToFirst()) {
                return cursor.getString(column_index);
            }
        } catch (Exception e) {
            // Eat it
        }
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
} 

推荐阅读