1

カスタムファイルタイプを使用するアプリに取り組んでいます。インテントフィルターを使用してこのタイプのファイルを開くことができるようにアプリをシステムに登録する方法を理解しました。アプリはアプリのリストにも表示されますこのタイプの添付ファイルを開こうとするときに、組み込みの電子メール クライアントからこのファイルを開くために使用できます。問題は、ファイル ブラウザーから渡されたときにファイルを開く処理を行うコードが、電子メール クライアントから渡されたときに機能しないことです。正しいタイプのファイルを選択した後、アクティビティがファイル ブラウザーから呼び出されたときに正しく動作するコードを次に示します。

Intent i = getIntent();
if(i == null) return;
Uri u = i.getData();
if(u == null) return;
String filePath = u.getEncodedPath();
if(filePath == null) return;
Util.loadOTDRFile(filePath);

ファイルブラウザからロードするときに「filePath」文字列に表示されるのは、「mnt/storage/Android/data/com.fiberdroid.001/downloads/filename.trc ...」のようなもので、アプリがロードするのに問題なく動作しますloadOTDRFile() 関数が正常に実行されました。

ただし、電子メールクライアントから同じタイプのファイルを開くと、そのコードの filePath 変数は次のようなものになります: "//mail/parts/4217" これはロードされず、ロード関数はファイルが見つからないことを返しますエラー。

loadOTDRFile() 関数の関連コードは次のとおりです。

File file = new File(filePath);
InputStream is;
try
{
    is = new FileInputStream(filePath);
}
catch(FileNotFoundException e)
{
    return D.ERROR_FILENOTFOUND;
}

私の質問は、「//mail/parts/4217」とはどのようなパスで、なぜ開けないのですか?

ありがとうございました。

4

2 に答える 2

7

これはコンテンツ URI です...メール プロバイダーからファイルを開くには、ContentResolver を使用する必要があります。

そのためには、次のことを行う必要があります。

getContentResolver().openInputStream(u); // Where 'u' is the uri you extract from the intent.

次のようなものを入れたいと思うかもしれません:

Uri u = i.getData();
String scheme = u.getScheme();
if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
    // handle as content uri
} else {
    // handle as file uri
}
于 2012-06-21T21:29:20.670 に答える
7

この質問に出くわす可能性のある人のために、サードパーティのアプリケーションから意図的に渡されたコンテンツ URI またはファイル URI からファイル データを読み取るために私が行ったことを次に示します。

まず、これらのインテント フィルターをマニフェストに配置し、".trc" を、アプリで開くタイプのファイル拡張子に置き換えます。

             <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
                <data android:scheme="file" />
                <data android:host="*" />
                <data android:port="*" />
                <data android:pathPattern=".*..*..*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*..*.trc" />
                <data android:pathPattern=".*..*..*.trc" />
                <data android:pathPattern=".*..*.trc" />
                <data android:pathPattern=".*.trc" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="content" />
                <data android:mimeType="text/plain" />
            </intent-filter>

これらのパス パターンについて私に聞かないでください。この Web サイトでそのソリューションに出くわす前に、うまくいかないことをたくさん試しました。

次に、ファイルを受信するアクティビティの onCreate() メソッドに次のようなコードを追加します (util.loadOTDRFile 関数は私のアプリに固有のものです。ファイルをロードするには、独自に作成する必要があります)。

        Intent i = getIntent();
        if(i == null) return;
        Uri u = i.getData();
        if(u == null) return;
        String scheme = u.getScheme();

        if(ContentResolver.SCHEME_CONTENT.equals(scheme))
        {
            try
            {
                ContentResolver cr = getContentResolver();
                AssetFileDescriptor afd = cr.openAssetFileDescriptor(u, "r");
                long length = afd.getLength();
                byte[] filedata = new byte[(int) length];
                InputStream is = cr.openInputStream(u);
                if(is == null) return;
                try
                {
                    is.read(filedata, 0, (int) length);
                    Util.loadOTDRFileFromByteArray(filedata);
                }
                catch(IOException e)
                {
                    return;
                }   
            }
            catch(FileNotFoundException e)
            {
                return;
            }
        } 
        else
        {
            String filePath = u.getEncodedPath();
            if(filePath == null) return;
            Util.loadOTDRFileFromPath(filePath);
        }
于 2012-06-22T13:15:01.413 に答える