2012-11-20 10 views
8

Sto provando a condividere il mio file di archiviazione interno tramite client Gmail sul mio Moto Razr, ma ogni volta che ho inviato al mio account gmail di prova, ho ottenuto tutto tranne l'allegato.Come condividere il file di archiviazione interno con Gmail Client

Ecco come invoco e avvio gmail, mentre aggiungo il file come allegato.

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

Ecco come implementare il mio fornitore di contenuti personalizzati.

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

}

Poi, aggiungo le seguenti righe nel mio file AndroidManifest.xml.

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

Mi chiedo cosa mi manca qui.

Ho controllo il link: Link1, Link2

+0

È possibile verificare se i metodi getType() e query (Uri uri, String [] proiezioni, String arg2, String [] arg3, String arg4) vengono chiamati? Se è così, posso fornirti un codice in modo che funzioni sia su Gmail che sul client di posta elettronica predefinito. – Snicolas

+0

Lo controllerò. Grazie. – antonio081014

+0

vedere la mia risposta qui: http://stackoverflow.com/questions/15377373/how-to-put-a-video-file-in-android-custom-content-provider – dangalg

risposta

3

Io uso questo:

AndroidManifest.xml

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

Button clic:

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

Mia classe Content Provider

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

Funziona anche per file generati dinamicamente o solo per beni in bundle? – Alex

Problemi correlati