4

質問:

アプリケーションでファイルとURL拡張子を無条件に開くにはどうすればよいですか?

intent-filterどれも実際には意味をなさないので、私は自分のセットアップで終わりです。path私の最終目標は、特定の拡張子で終わるものをすべて開くことです。例として、目標の拡張子として「.riley」を選択しましょう。

私のベース`intent-filter`

<intent-filter>
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data
        android:host="*"
        android:mimeType="*/*"
        android:pathPattern=".*\\.riley" />
</intent-filter>

fileこれは現在、およびから開くように機能しますcontent

問題#1:pathPattern

data手始めに、私が設定したように、パラメータpathPatternが何もしないように見えます:

<data
    android:host="*"
    android:mimeType="*/*"
    android:pathPattern=".*\\.riley" />

..しかし、 andスキームの下で「.riley」で終わらないパスでIntentsを開くことはできます。Urifilecontent

これを使用してアプリケーションが開いたパスの例は次のintent-filterとおりです。

Path: /storage/sdcard0/Download/MyApp.apk Path: /messagesByAccount/1

「パス:」は、わかりやすくするためにログに追加したものです。1つ目はスキームの下のGmailからのものfileで、2つ目はスキームの下のgtalkからのものですcontent。それを考えると、私はすでにどのように機能するかについて混乱していますintent-filters

とスキームpathPatternでは無視されています。filecontent

問題#2:ブラウザで開く

アプリケーションでブラウザから「.riley」拡張子を開こうとしましたが、リダイレクトリンクにMIMEタイプがないため、パターンmimeTypeから値を削除しました( MIMEタイプがないため、以前に使用していました)。一貫性があります)そしてそれは私がURLをリダイレクトすることからうまく開くことを可能にしました。dataandroid:mimeType="*/*"

この問題は、ブラウザから直接「.riley」 URL(例:http ://thisisnotarealdomainname.com/myfile.riley)を開こうとしたときに、アプリケーションから開くオプションがなくなったときに発生しました。mimeTypeパターンに値を追加するdataと、直接URLから開くことができました。

直接URLと間接URLのintent-filter両方を開くことはできません。

問題#3:スキーム

さまざまな種類のスキーム(http,ファイル,コンテンツ), but as soon as I removeスキームaltogether, it disqualifies my application from opening thehttp scheme and when I specifyScheme = "*" , it disqualifies my application from opening ANY scheme. I've also tried adding moredata`パターンなど)から開くことができるようにしたいと思いますが、1つだけが有効になっているように感じますが、そうではありません。助けてください。

したがって、指定するhttpとは可能になりますがhttp、明らかに、無効化を指定しないか、fileまたは指定しないことは許可されていません。contentschemehttp

私はすべての異なるスキームから開くことはできません。

繰り返しになりますが、これらの複雑さを考慮して、アプリケーションでファイルとURL拡張子を無条件に開くにはどうすればよいですか?

4

1 に答える 1

3

問題#1:<data android:pathPattern=".*\\.riley" />単に無効です。ドキュメントの引用:

[pathPatternは]スキームとホスト属性もフィルターに指定されている場合にのみ意味があります。

問題#2:Webサーバーが深刻に壊れていない限り、「リダイレクトリンクにはMIMEタイプがない」は正しくないはずです。HTTPリダイレクト自体にはMIMEタイプはありませんが、ブラウザ自体が処理する必要があります。ブラウザがリダイレクトを処理するまで、URLが処理する必要のあるもの(Webページなど)を指しているかどうかがわからないためです。またはダウンロードする必要があるもの。リダイレクトの結果(HTTP 200 OK応答)は、MIMEタイプである必要があります。ダウンロードにリダイレクトされたURLが機能しないと確信している場合は、エラーを示すサンプルプロジェクトを作成し、レビューのためにどこかに投稿してください。

問題#3:「すべての異なるスキームから開くことはできません。」-別々の要素で、複数の属性<data>を持つ複数の要素を使用します。android:scheme<intent-filter>

たとえば、AOSPミュージックアプリには次のものがあります。

    <activity android:name="AudioPreview" android:theme="@android:style/Theme.Dialog"
            android:taskAffinity=""
            android:excludeFromRecents="true" android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http" />
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
        <intent-filter
            android:priority="-1">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="content" />
            <data android:mimeType="audio/*"/>
            <data android:mimeType="application/ogg"/>
            <data android:mimeType="application/x-ogg"/>
            <data android:mimeType="application/itunes"/>
        </intent-filter>
    </activity>

アクション、カテゴリ、およびMIMEタイプは、3つ<intent-filter>のスタンザすべてで同じであることがわかります。属性のみがandroid:scheme異なります。

現在、fileこのミュージックアプリの例のスキームは、一部のローカルファイルマネージャーが適切なMIMEタイプをIntent;にアタッチしている場合にのみ機能します。android:pathPattern音楽は、ファイル拡張子を一致させるために使用しようとはしません。実際、Googleがを使用することはめったにありませんandroid:pathPattern。AOSPカレンダーアプリには次の1つのオカレンスがあります。

        <intent-filter
           android:priority="50">
           <action android:name="android.intent.action.VIEW" />
           <category android:name="android.intent.category.DEFAULT" />
           <category android:name="android.intent.category.BROWSABLE" />
           <data android:scheme="http" android:host="www.google.com" android:pathPrefix="/calendar/event" />
           <data android:scheme="https" android:host="www.google.com" android:pathPrefix="/calendar/event" />
           <data android:scheme="http" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
           <data android:scheme="https" android:host="www.google.com" android:pathPattern="/calendar/hosted/.*/event" />
        </intent-filter>

しかし、それはほとんどそれです。確かに他の人もそれを試しました-StackOveflowにはその使用法をカバーするたくさんの質問があります。

于 2013-03-25T22:58:13.143 に答える