调用ACTION_GET_CONTENT Intent后,文件无法选择

时间:2014-12-31 16:53:40

标签: android android-external-storage

我正在开发一个应用程序,在此活动中按下一个按钮,可以选择上传任何文件。 文件选择器正确加载,但所有图像都是不可选择的(灰色)。我将READ_EXTERNAL_STORAGE权限添加到Manifest文件,但我不知道为什么它仍然不允许我选择文件。这是我正在使用的代码

private Button uploadButton;
private TextView uploadFile;
private static final int PICKFILE_RESULT_CODE = 1;
private String selectedImagePath;

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

    uploadButton = (Button)findViewById(R.id.upload_button);
    uploadFile = (TextView)findViewById(R.id.uploadFile);

    uploadButton.setOnClickListener(new View.OnClickListener()
    {

        public void onClick(View v){

            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("file/*");
            startActivityForResult(intent, PICKFILE_RESULT_CODE);
    }});
    }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode){
    case PICKFILE_RESULT_CODE:
        if (resultCode==RESULT_OK){
            String FilePath = data.getData().getPath();
            uploadFile.setText(FilePath);
        }
        break;
    }
}

4 个答案:

答案 0 :(得分:10)

尝试按照Blundell的建议将类型设置为"*/*

如果您不希望用户能够选择任何类型的内容,则应在onActivityResult中记录文件的类型(this answer显示如何)。然后尝试几个有效文件,查看日志并相应地修改intent.setType。您可以在this answer

中描述的KitKat及更高版本上使用多种类型

答案 1 :(得分:4)

Blundell在上面的评论中提到了它,但您也可以将以下内容添加到您的清单文件中。另外,尝试使用setType(“image /*).

    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

答案 2 :(得分:2)

当我尝试使用marshmellow时,以下代码有帮助。我试过用c#(xamarin)。多重哑剧类型是关键。希望这有助于某人

Intent intent = new Intent(Intent.ActionOpenDocument);
            intent.SetType("file/*");
            intent.AddCategory(Intent.CategoryOpenable);
            String[] mimeTypes = { "text/csv", "text/comma-separated-values" ,"application/pdf","image/*"};
            intent.PutExtra(Intent.ExtraMimeTypes, mimeTypes);
            ((FormsAppCompatActivity)Forms.Context).StartActivityForResult(intent, 7007);

答案 3 :(得分:0)

此代码适用于打开文本(* .txt)文件。如果您使用ACTION_GET_CONTENT,也可以从Google驱动器(或其他使用该意图的应用)中打开文件。如果使用ACTION_OPEN_DOCUMENT,则仅显示内部文件。其他文件类型显示为灰色。

请记住对清单文件具有适当的权限。

verifyStoragePermissions(ImportExportActivity.this);
String[] mimeTypes = { "text/plain"};
Intent intent = new Intent()
        .putExtra(Intent.EXTRA_LOCAL_ONLY, true)
        .putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
        .setType("file/*")
        //.setAction(Intent.ACTION_OPEN_DOCUMENT);
        .setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(Intent.createChooser(intent, "Select a text file"), 123);



private static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}