Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 注册为自定义文件类型的默认应用程序_Android_File_Android Intent_Handle - Fatal编程技术网

Android 注册为自定义文件类型的默认应用程序

Android 注册为自定义文件类型的默认应用程序,android,file,android-intent,handle,Android,File,Android Intent,Handle,注册以能够打开自定义类型的文件。假设我有.cool文件,如果用户试图打开它,Android会询问他们是否愿意用我的应用程序打开它。怎么做?我想你不会选择的。这是由系统处理的。同样,当您发送一个由地图处理的意图时,例如,如果您有skyfire,系统会弹出一个窗口,您可以选择应用程序并选择是否希望它始终打开此类文件。 当然,除非您的应用程序是唯一打开此类文件的应用程序 编辑 我认为,如果你想让你的应用程序说“嘿,我可以打开这些.cool文件”,你需要用标签设置,并指定mimeType或Uri。有关更

注册以能够打开自定义类型的文件。假设我有.cool文件,如果用户试图打开它,Android会询问他们是否愿意用我的应用程序打开它。怎么做?

我想你不会选择的。这是由系统处理的。同样,当您发送一个由地图处理的意图时,例如,如果您有skyfire,系统会弹出一个窗口,您可以选择应用程序并选择是否希望它始终打开此类文件。
当然,除非您的应用程序是唯一打开此类文件的应用程序

编辑

我认为,如果你想让你的应用程序说“嘿,我可以打开这些.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>