2011-06-30 5 views
5

私はGmailのアプリケーションから添付ファイルを開く必要があります。Android Gmail app-mail添付ファイルURIの問題

私はコンテンツのようなパターンでリンクを取得://gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false

私の問題は、リンクのために特有のものではないですメールクライアントの各ファイル。 1つ以上のファイルが同じです。Uri

この問題を解決できるように、ファイル名またはメール送信日を取得する方法はありますか。

ありがとうございます。

答えて

2

私はこの問題を間接的に解決しました。

ファイルサイズを使用して一意性を識別しました。インケース

あなたがここにコードが必要な場合、それは、私は最近、同じ問題に出くわしたとファイル名を取得する方法を見つけた

InputStream is = getContentResolver().openInputStream(uri); 
FILE_SIZE=is.available(); 
+1

を私は共有の意図を経由して私のアプリにGmailアプリから添付画像を取得したいが、私はuが指定されているファイルのURIをデコードすることはできませんよ投稿内容://gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false "助けてください。 –

0

です:

public static String getContentName(ContentResolver resolver, Uri uri){ 
    Cursor cursor = resolver.query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null); 
    cursor.moveToFirst(); 
    int nameIndex = cursor.getColumnIndex(cursor.getColumnNames()[0]); 
    if (nameIndex >= 0) { 
     return cursor.getString(nameIndex); 
    } else { 
     return null; 
    } 
} 

使用するには:

String fileName = getContentName(getContentResolver(), getIntent().getData()); 

よろしくお願いいたします。

7

以下に示すように、同じ添付ファイルのローカルコピーを作成し、そのファイルで作業することができます。あなたはGmailサーバー上のそのファイルに直接アクセスすることはできません。

Uri uri = getIntent().getData(); 
    if (uri != null) { 
    try { 
     InputStream attachment = getContentResolver().openInputStream(uri); 
     if (attachment == null) 
      Log.e("GMAIL ATTACHMENT", "Mail attachment failed to resolve"); 
     else { 

      FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
      byte[] buffer = new byte[1024]; 
      while (attachment.read(buffer) > 0) 
       tmp.write(buffer); 
      tmp.close(); 
      attachment.close(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
    return getCacheDir().getPath() + "/temp.myfile"; 

これをマニフェストに追加することをお忘れなく。

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

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

      <data 
       android:host="*" 
       android:mimeType="application/octet-stream" 
       android:pathPattern=".*\\.tsconfig" /> 
      <!-- To handle gmail attachments --> 
    </intent-filter> 
0

ありがとうございますLokesh Kumar、あなたのコードは多くの助けになりました! しかし、私はあなたのソリューションに関する問題を強調したいと思います。あなたのこのコードを使用しようとすると

FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
     byte[] buffer = new byte[1024]; 
     while (attachment.read(buffer) > 0) 
      tmp.write(buffer); 
     tmp.close(); 
     attachment.close(); 

それはファイル全体をコピーしなかったが、私は問題があると思います。 attachment.read(buffer)を実行するときは、毎回1024バイトを読み込み、2000バイトのファイルがあるとします。

最初の読書では、最初の1024を取得し、次の最後の読書では、最後の976バイトが得られます。この場合、バッファは最後のバイト読み込まれたプレビューから、ファイルの最後は最後の読み取りから976バイト、残りの48は最後の読み取りの前に読み込まれます。 これにより、ファイルの最後が正しくなりません。

私の場合、添付ファイルは、コピーしなければならないkmlファイル(xml形式の位置データファイル)です。このコードを使用しようとすると、私はいつもkmlの終わりが間違っています。終了タグの後には、最後のテキストの前に読まれたテキストがあります。このような

何か:もちろん

</Document> 
</kml> 
278 
34.81186031,31.96118044 
34.81184437,31.96122622 
34.81181701,31.96127052 
34.81182701,31.9612875 

、これは有効なKMLではなく、PARSにそれをしようとしたときには、エラーが発生します。

したがって、入力ストリームから読み込むためにいくつかの異なるコードを使用しています。

これは、ファイルのコピーのために私のコードです:

InputStream attachment = getContentResolver().openInputStream(container.uri); 
      FileOutputStream tmp = new FileOutputStream(container.fileName); 

      BufferedInputStream bis = new BufferedInputStream(attachment); 
      StringBuffer b = new StringBuffer(); 

      while (bis.available() != 0) { 
       char c = (char) bis.read(); 
       b.append(c); 
      } 

      bis.close(); 
      attachment.close(); 
      tmp.write(String.valueOf(b).getBytes()); 
      tmp.close(); 
関連する問題