2011-06-30 14 views
5

Próbuję dołączyć plik z folderu/data urządzenia.dołączanie pliku do wiadomości e-mail z folderu/danych urządzenia

Udało mi się utworzyć "abc.txt" w folderze/data, widzę plik w tym miejscu.

Używam poniżej kod, aby wysłać e-mail:

Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("text/plain"); 
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{[email protected]}); 
    intent.putExtra(Intent.EXTRA_STREAM, 
     Uri.parse(Environment.getDataDirectory()+"/abc.txt")); 
    intent.putExtra(Intent.EXTRA_TEXT, "hello.."); 
    startActivity(Intent.createChooser(intent, email_chooser_title)); 

ale nie jestem w stanie odbierać załączniki ..

pl. daj mi znać, jaki błąd popełniłem.

dziękuję.

+0

You dont uzyskać jakieś błędy? Po prostu wysyła, otrzymujesz e-mail, ale bez załącznika? –

+0

Nie otrzymałem żadnych błędów. Po prostu wysyła bez żadnych załączników. – brig

Odpowiedz

2

Należy skopiować plik do zewnętrznego katalogu (na przykład karty SD). To dlatego, że aplikacja e-mail nie może uzyskać dostępu do katalogu danych (w taki sam sposób, że nie może uzyskać dostępu do katalogu danych innych aplikacji)

+0

Tak, prawdopodobnie działałoby, gdyby telefon był w trybie root. –

+0

Tak, jeśli w trybie głównym, możesz czytać pliki z/data/folderu ...w przeciwnym razie musisz użyć/sdcard – Cristian

+0

To nie jest technicznie prawdziwe; możesz umieścić plik czytelny dla świata * w folderze aplikacji * pod/dane lub gdziekolwiek to urządzenie z Androidem zapewnia aplikacje z pamięcią wewnętrzną i aplikacją e-mailową _dłużyłyby ją przeczytać, chociaż były wersje aplikacji Gmail, które odmówiły aby to zrobić (nawet jeśli pozwoliłby na to system operacyjny), chyba że wskazano tam jakąś sztuczkę /../../. –

0

Spróbuj zamiast 4. wierszu

intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/data/abc.txt")); 

Jeśli jest w sdcard:

intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/sdcard/data/abc.txt")); 
+0

Uwaga pierwsza nie zadziała, ponieważ dana aplikacja nie ma uprawnień do zapisywania niczego _directly_ w/data, ale tylko w przypisanym podfolderze wewnątrz/data. Zdolność odczytu innej aplikacji będzie opierać się na uprawnieniach ustawionych przez tego, kto utworzył plik, chociaż _ability_ i _willingness_ do czytania nie są tym samym w przypadku aplikacji Gmail. –

0

Zamiast Environment.getDataDirectory()+"/abc.txt" nie spróbować użyć Environment.getExternalStorageDirectory()+"/abc.txt"?

Uważam, że ta zmiana powinna załatwić sprawę. Oczywiście, aby to zadziałało, musisz mieć plik na karcie SD telefonu/emulatora.

1

Spróbuj użyć tego kodu:

File sdCard = Environment.getExternalStorageDirectory(); 
PATH=sdCard.toString()+"/abc.txt"; 
Intent intent=new Intent(Intent.ACTION_SEND); 
intent.setType("**/**");// or intent.setType("text/plain"); 
String[] recipients={"[email protected]"); 
intent.putExtra(Intent.EXTRA_EMAIL, recipients); 
intent.putExtra(Intent.EXTRA_SUBJECT,getResources().getString(R.string.app_name)); 
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+PATH)); 
intent.putExtra(Intent.EXTRA_TEXT, "hello.."); 
startActivity(Intent.createChooser(intent,"")); 

Upewnij się, że plik abc.txt w urządzeniu/sdcard emulatora.

obejmują także te dwa uprawnienia w pliku manifestu projektu:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
+0

czy działa? – AkashG

0
Try this code!!!!  


File sdCard = Environment.getExternalStorageDirectory(); 
PATH=sdCard.toString(); 
String path =PATH.replace("/mnt","") + "/abc.txt"; 
Intent intent=new Intent(Intent.ACTION_SEND); 
intent.setType("**/**");// or intent.setType("text/plain"); 
String[] recipients={"[email protected]"); 
intent.putExtra(Intent.EXTRA_EMAIL, recipients); 
intent.putExtra(Intent.EXTRA_SUBJECT,getResources().getString(R.string.app_name)); 
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://" +path)); 
intent.putExtra(Intent.EXTRA_TEXT, "hello.."); 
startActivity(Intent.createChooser(intent,"")); 
1

Od Android: Attaching files from internal cache to Gmail (z pewnymi modyfikacjami, które pozwala na uruchomienie tego kodu na Lollipop).

Zasadniczo trzeba zaimplementować własną klasę, która rozciąga ContentProvider (powiedzmy CachedFileProvider, patrz poniżej), i dodać kolejne pole w oczywisty (wewnątrz/tag aplikacji):

<provider 
     android:name=".CachedFileProvider" 
     android:authorities="com.your.app.provider" 
     android:grantUriPermissions="true" /> 

Podczas otwierania Chooser mail używać następny kod:

File f = getLocalFileToSend(); 
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + f.getName()); 
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/plain"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
intent.putExtra(Intent.EXTRA_TEXT, "Body"); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Grant permissions to read. 
startActivity(Intent.createChooser(intent, "Send Email")); 

kod dla CachedFileProvider:

package ...; 

import java.io.File; 
import java.io.FileNotFoundException; 

import android.content.ContentProvider; 
import android.content.ContentValues; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.ParcelFileDescriptor; 
import android.util.Log; 


public class CachedFileProvider extends ContentProvider { 

    private static final String TAG = "CachedFileProvider"; 

    private static final String CLASS_NAME = "CachedFileProvider"; 

    // The authority is the symbolic name for the provider class. 
    // Should match one in the manifest file. 
    public static final String AUTHORITY = "com.your.app.provider"; 

    // UriMatcher used to match against incoming requests 
    private UriMatcher uriMatcher; 

    @Override 
    public boolean onCreate() { 
     uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 

     // Add a URI to the matcher which will match against the form 
     // 'content://com.stephendnicholas.gmailattach.provider/*' 
     // and return 1 in the case that the incoming Uri matches this pattern 
     uriMatcher.addURI(AUTHORITY, "*", 1); 

     return true; 
    } 

    @Override 
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
     Log.v(TAG, "Called with uri: '" + uri + "'." + uri.getLastPathSegment()); 

     // Check incoming Uri against the matcher 
     switch (uriMatcher.match(uri)) { 

      // If it returns 1 - then it matches the Uri defined in onCreate 
      case 1: 

       // The desired file name is specified by the last segment of the path. 
       String fileLocation = getContext().getCacheDir() + File.separator 
         + uri.getLastPathSegment(); 

       // Create & return a ParcelFileDescriptor pointing to the file 
       // Note: I don't care what mode they ask for - they're only getting 
       // read only 
       ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(
         fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); 
       return pfd; 

      // Otherwise unrecognised Uri 
      default: 
       Log.v(TAG, "Unsupported uri: '" + uri + "'."); 
       throw new FileNotFoundException("Unsupported uri: " 
         + uri.toString()); 
     } 
    } 

    // ////////////////////////////////////////////////////////////// 
    // Not supported/used/required for this example 
    // ////////////////////////////////////////////////////////////// 

    @Override 
    public int update(Uri uri, ContentValues contentvalues, String s, 
         String[] as) { 
     return 0; 
    } 

    @Override 
    public int delete(Uri uri, String s, String[] as) { 
     return 0; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues contentvalues) { 
     return null; 
    } 

    @Override 
    public String getType(Uri uri) { 
     return null; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String s, String[] as1, 
         String s1) { 
     return null; 
    } 
} 
Powiązane problemy