Android 注册为自定义文件类型的默认应用程序
注册以能够打开自定义类型的文件。假设我有.cool文件,如果用户试图打开它,Android会询问他们是否愿意用我的应用程序打开它。怎么做?我想你不会选择的。这是由系统处理的。同样,当您发送一个由地图处理的意图时,例如,如果您有skyfire,系统会弹出一个窗口,您可以选择应用程序并选择是否希望它始终打开此类文件。Android 注册为自定义文件类型的默认应用程序,android,file,android-intent,handle,Android,File,Android Intent,Handle,注册以能够打开自定义类型的文件。假设我有.cool文件,如果用户试图打开它,Android会询问他们是否愿意用我的应用程序打开它。怎么做?我想你不会选择的。这是由系统处理的。同样,当您发送一个由地图处理的意图时,例如,如果您有skyfire,系统会弹出一个窗口,您可以选择应用程序并选择是否希望它始终打开此类文件。 当然,除非您的应用程序是唯一打开此类文件的应用程序 编辑 我认为,如果你想让你的应用程序说“嘿,我可以打开这些.cool文件”,你需要用标签设置,并指定mimeType或Uri。有关更
当然,除非您的应用程序是唯一打开此类文件的应用程序 编辑
我认为,如果你想让你的应用程序说“嘿,我可以打开这些.cool文件”,你需要用标签设置
,并指定mimeType或Uri。有关更多详细信息。您可以将以下内容添加到必须打开文件的活动中的AndroidManifest.xml文件中(本例中为pdf)
更多详细信息。下面是一个更完整的示例,演示如何注册应用程序以打开纯文本文件
注册您可以处理的文件类型
向清单中的活动添加一个意图过滤器
。在我的例子中,ReaderActivity
将显示文本文件。mimeType
表示我将接受任何纯文本文件。有关特定的文件扩展名,请参见
<activity android:name=".ReaderActivity">
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
您可以使用getData()
从intent获取数据,以获取文件的URI。然后使用内容解析器打开输入流。使用内容解析器是因为您可能无法直接访问该文件。感谢提供了将输入流转换为字符串的方法 显示了一个可能的答案
. 在你的活动标签中使用这个,当文件被按下时,它就会被打开。我在Oreo中使用原生android文件管理器对其进行了测试
<intent-filter android:priority="999">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.OPENABLE" />
<data android:host="*" />
<data android:mimeType="application/octet-stream" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\.yourextension" />
<data android:pathPattern=".*\\.yourextension" />
<data android:scheme="content" />
</intent-filter>
他正在询问如何指定他的应用程序可以处理文件类型。清单部分,并启动活动,从选择我的应用程序的人那里检索文件。我现在没有时间更正和测试某些内容。请尝试一下,如果我有时间,我会稍后再看。我告诉过你,我现在不知道,我必须运行一些测试和代码。我不是一直在用这个。我的建议帮你找到正确的方向了吗?对不起,我已经在火车上一整天了…要打开其他类型的文件,您可以将“application/pdf”更改为“/”(这将打开所有扩展名)。要限制为一个特定的扩展,您可以添加和下一步。。。应用程序如何获取文件路径???嗨,我有自己的扩展名。我应该在mimeType中输入什么?@LorenceHernandez,查看自定义文件扩展名。handleIntent部分正是我所需要的,它工作得非常好!非常感谢。
public class ReaderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reader);
handleIntent();
}
private void handleIntent() {
Uri uri = getIntent().getData();
if (uri == null) {
tellUserThatCouldntOpenFile();
return;
}
String text = null;
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
text = getStringFromInputStream(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (text == null) {
tellUserThatCouldntOpenFile();
return;
}
TextView textView = findViewById(R.id.tv_content);
textView.setText(text);
}
private void tellUserThatCouldntOpenFile() {
Toast.makeText(this, getString(R.string.could_not_open_file), Toast.LENGTH_SHORT).show();
}
public static String getStringFromInputStream(InputStream stream) throws IOException {
int n = 0;
char[] buffer = new char[1024 * 4];
InputStreamReader reader = new InputStreamReader(stream, "UTF8");
StringWriter writer = new StringWriter();
while (-1 != (n = reader.read(buffer))) writer.write(buffer, 0, n);
return writer.toString();
}
}
<intent-filter android:priority="999">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.OPENABLE" />
<data android:host="*" />
<data android:mimeType="application/octet-stream" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\..*\\.yourextension" />
<data android:pathPattern=".*\\..*\\.yourextension" />
<data android:pathPattern=".*\\.yourextension" />
<data android:scheme="content" />
</intent-filter>