2012-11-20 22 views
8

Tôi đang cố gắng chia sẻ tệp lưu trữ nội bộ của mình qua ứng dụng Gmail trên Moto Razr của mình, nhưng mỗi lần tôi gửi tài khoản gmail thử nghiệm của mình, tôi nhận được mọi thứ ngoại trừ tệp đính kèm.Cách chia sẻ tệp lưu trữ nội bộ với Ứng dụng khách Gmail

Đây là cách tôi gọi và bắt đầu gmail, trong khi thêm tệp dưới dạng tệp đính kèm.

private void saveDaily() { 
Intent intent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
intent.setType("text/plain"); 

intent.putExtra(Intent.EXTRA_EMAIL, new String[] { loadEmailAddress() }); 
intent.putExtra(Intent.EXTRA_SUBJECT, "Daily"); 
intent.putExtra(Intent.EXTRA_TEXT, "Daily Log"); 
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

ArrayList<Uri> uris = new ArrayList<Uri>(); 
uris.add(saveDaily2File("dailyRecord.txt")); 
Log.d(TAG_D, "Size: " + uris.size()); 
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
startActivity(Intent.createChooser(intent, "Send email")); 
} 

Đây là cách tôi triển khai nhà cung cấp nội dung tùy chỉnh của mình.

public class SavedFileProvider extends ContentProvider { 

private static final String TAG_D = "ContentProvider"; 
private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>(); 

static { 
MIME_TYPES.put(".txt", "text/plain"); 
} 

@Override 
public String getType(Uri uri) { 
String path = uri.toString(); 

for (String extension : MIME_TYPES.keySet()) { 
    if (path.endsWith(extension)) { 
    return (MIME_TYPES.get(extension)); 
    } 
} 

return (null); 
} 

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
    throws FileNotFoundException { 
Log.d(TAG_D, "openFile()"); 

File f = new File(getContext().getFilesDir(), uri.getPath()); 

Log.d(TAG_D, f.getAbsolutePath()); 
if (f.exists()) { 
    return (ParcelFileDescriptor.open(f, 
     ParcelFileDescriptor.MODE_READ_ONLY)); 
} 

throw new FileNotFoundException(uri.getPath()); 
} 

@Override 
public Cursor query(Uri url, String[] projection, String selection, 
    String[] selectionArgs, String sort) { 
throw new RuntimeException("Operation not supported"); 
} 

@Override 
public Uri insert(Uri uri, ContentValues initialValues) { 
throw new RuntimeException("Operation not supported"); 
} 

@Override 
public int update(Uri uri, ContentValues values, String where, 
    String[] whereArgs) { 
throw new RuntimeException("Operation not supported"); 
} 

@Override 
public int delete(Uri uri, String where, String[] whereArgs) { 
throw new RuntimeException("Operation not supported"); 
} 

private void copy(InputStream in, File dst) throws IOException { 
FileOutputStream out = new FileOutputStream(dst); 
byte[] buf = new byte[1024]; 
int len; 

while ((len = in.read(buf)) > 0) { 
    out.write(buf, 0, len); 
} 

in.close(); 
out.close(); 
} 

@Override 
public boolean onCreate() { 
Log.d(TAG_D, "onCreate()"); 
File f = new File(getContext().getFilesDir(), "dailyRecord.txt"); 

if (!f.exists()) { 
    AssetManager assets = getContext().getResources().getAssets(); 

    try { 
    copy(assets.open("dailyRecord.txt"), f); 
    } catch (IOException e) { 
    Log.e("FileProvider", "Exception copying from assets", e); 

    return (false); 
    } 
} 
return (true); 
} 

}

Sau đó, tôi thêm những dòng sau đây trong AndroidManifest.xml file của tôi.

<provider 
     android:name=".SavedFileProvider" 
     android:authorities="Package Path here" 
     android:exported="true" 
     android:grantUriPermissions="true" 
     android:multiprocess="true" > 
</provider> 

Tôi tự hỏi mình đang thiếu gì ở đây.

Tôi có kiểm tra liên kết: Link1, Link2

+0

Bạn có thể kiểm tra các phương thức getType() và truy vấn (Uri uri, String [], String arg2, String [] arg3, String arg4) đang được gọi không? Nếu có, tôi có thể cung cấp cho bạn một số mã để làm việc cả gmail và ứng dụng email mặc định. – Snicolas

+0

Tôi sẽ kiểm tra điều đó. Cảm ơn. – antonio081014

+0

xem câu trả lời của tôi ở đây: http://stackoverflow.com/questions/15377373/how-to-put-a-video-file-in-android-custom-content-provider – dangalg

Trả lời

3

tôi sử dụng này:

AndroidManifest.xml

<provider android:name="com.myapp.main.MyContentProvider" android:authorities="com.myapp.main"></provider> 

Nút bấm:

 public void onClick(View v) { 

      List<Intent> targetedShareIntents = new ArrayList<Intent>(); 
      Intent shareIntent = new Intent(Intent.ACTION_SEND); 
      shareIntent.setType("image/jpg"); 
      Uri theUri = Uri.parse("content://com.myapp.main/"+srcImage); 
      List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0); 
      int i=0; 
      List<ResolveInfo> reInfoToDelete = new ArrayList<ResolveInfo>(); 
      if (!resInfo.isEmpty()){ 
        for (ResolveInfo resolveInfo : resInfo) { 
         String packageName = resolveInfo.activityInfo.packageName; 
         Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND); 
         targetedShareIntent.setType("image/jpg"); 
         targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Share file"); 
         if (packageName.equals("com.google.android.gm")){ 
          targetedShareIntent.setType("image/png"); 

          targetedShareIntent.putExtra(Intent.EXTRA_TEXT, "some text"); 
          targetedShareIntent.putExtra(Intent.EXTRA_STREAM, theUri); 
          targetedShareIntent.setPackage(packageName); 
          targetedShareIntents.add(targetedShareIntent); 

         } 
        } 



        startActivity(targetedShareIntents.remove(0)); 
       } 
     } 

My Content Provider Lớp

public class MyContentProvider extends ContentProvider implements PipeDataWriter<InputStream>{ 

    @Override 
    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { 
     //Adapt this to your code 
     AssetManager am = getContext().getAssets(); 
     String file_name = "path/"+uri.getLastPathSegment(); 
     if(file_name == null) 
      throw new FileNotFoundException(); 
     AssetFileDescriptor afd = null; 
     try { 
      afd = am.openFd(file_name); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return afd;//super.openAssetFile(uri, mode); 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public String getType(Uri uri) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean onCreate() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, 
      String[] selectionArgs) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public void writeDataToPipe(ParcelFileDescriptor arg0, Uri arg1, 
      String arg2, Bundle arg3, InputStream arg4) { 
     // Transfer data from the asset to the pipe the client is reading. 
     byte[] buffer = new byte[8192]; 
     int n; 
     FileOutputStream fout = new FileOutputStream(arg0.getFileDescriptor()); 
     try { 
      while ((n=arg4.read(buffer)) >= 0) { 
       fout.write(buffer, 0, n); 
      } 
     } catch (IOException e) { 
      Log.i("InstallApk", "Failed transferring", e); 
     } finally { 
      try { 
       arg4.close(); 
      } catch (IOException e) { 
      } 
      try { 
       fout.close(); 
      } catch (IOException e) { 
      } 
     } 
    } 
} 
+0

Điều này cũng làm việc cho các tệp được tạo động hoặc chỉ cho tài sản đi kèm? – Alex

Các vấn đề liên quan