2012-11-20 27 views
8

Staram się dzielić mój plik pamięci wewnętrznej za pośrednictwem klienta Gmail na moim Moto Razr, ale za każdym razem wysłał do mojego konta gmail testu, mam wszystko oprócz przywiązania.Jak udostępnić plik pamięci wewnętrznej z Gmaila Klienta

Oto jak mogę uruchomić i uruchomić Gmail, dodając plik jako załącznik.

W ten sposób wdrażam mojego spersonalizowanego dostawcę treści.

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); 
} 

}

Następnie dodać następujące wiersze w moim AndroidManifest.xml pliku.

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

Zastanawiam się, czego tu brakuje.

muszę sprawdzić link: Link1, Link2

+0

Czy można sprawdzić, czy są wywoływane metody getType() i zapytania (Uri uri, String [] projekcje, String arg2, String [] arg3, String arg4)? Jeśli tak, mogę podać Ci kod, dzięki któremu będzie działać zarówno Gmail, jak i domyślny klient poczty e-mail. – Snicolas

+0

Sprawdzę to. Dzięki. – antonio081014

+0

zobacz moją odpowiedź tutaj: http://stackoverflow.com/questions/15377373/how-to-put-a-video-file-in-android-custom-content-provider – dangalg

Odpowiedz

3

Używam tego:

AndroidManifest.xml

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

Przycisk kliknięcie:

 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 Klasa

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

Czy to działa również w przypadku dynamicznie generowanych plików lub tylko dla aktywów w pakiecie? – Alex