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);
}
});
}
对我来说,这解决了问题。
我想使用 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);
}
});
}
对我来说,这解决了问题。