Android 意图选择器 - 错误的命题

Android Intent chooser - wrong propositions

我想使用 Intent 选择器打开我的应用程序中的任何文件 - 不幸的是,选择器的提议很……奇怪。选择 png 文件后,它只显示一个选项 - Drive PDF Viewer。但是当我尝试使用默认文件资源管理器打开同一个文件时,它正确地建议使用 Galery 或 Photos。

String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.toLowerCase());
Log.i(TAG, mime); // <------------ image/png
Intent intent= new Intent(Intent.ACTION_VIEW);
intent.setType(mime);
intent.setData(Uri.fromFile(file));  // <----- png file
Intent chooser = Intent.createChooser(intent, "Choose an application to open with:");
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooser);

这里有什么问题吗?

试试这个,

String[] mimetypes = {"image/*"};
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);

这可能对你有帮助

尝试添加这个而不是 mime

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Image"),REQUEST_TAKE_GALLERY_IMAGE);

setDataAndType 试试这个:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "image/*");
Intent chooser = Intent.createChooser(intent, "Choose an application to open with:");
context.startActivity(chooser);

请参阅 class Intent:
中方法 setType(String type) 的 Javadoc ...
此方法会自动清除之前设置的所有数据(例如通过 setData(Uri))。
...

当我使用以下代码时,我也看到同样的消息弹出:

public class MainActivity extends AppCompatActivity {
intent = new Intent(MainActivity.this, SecondActivity.class);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.coordinator_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TextView textView = (TextView) findViewById(R.id.gotoA);
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            intent.putExtra("show 1",true);
            startActivity(intent);
        }
    });

    TextView textView1 = (TextView) findViewById(R.id.gotoB);
    textView1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            intent.putExtra("show 2",true);
            startActivity(intent);
        }
    });
}

所以我将 Intent 构造函数带到我使用该 Intent 实例的地方。

public class MainActivity extends AppCompatActivity {
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.coordinator_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TextView textView = (TextView) findViewById(R.id.gotoA);
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("show 1",true);
            startActivity(intent);
        }
    });

    TextView textView1 = (TextView) findViewById(R.id.gotoB);
    textView1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("show 2",true);
            startActivity(intent);
        }
    });
}

对我来说,这解决了问题。