0

我試圖從我的應用程序發送電子郵件。 這個電子郵件sholud包含一個attchment。 我的MainActiviry調用intent服務並尋找權限。這是這個樣子 -Android通過意向服務發送帶附件的電子郵件

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) && 
        (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) 
       startCommaSeparatedService(); 
      else { 
       if(shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) && 
         shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) 
        Toast.makeText(this, "Track your nevi required access to external storage", Toast.LENGTH_LONG).show(); 
       requestPermissions(PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); 
      } 
     } else { 
      startCommaSeparatedService(); 
     } 
} 



private void startCommaSeparatedService() { 
    ArrayList<ResultsExport> toExport = mDataBaseHelper.getAllDataParsed(); 
    if(toExport.size() > 0) { 
      Intent intent = new Intent(MainActivity.this, CommaSeparatedValuesService.class); 
      intent.setAction(CommaSeparatedValuesService.ACTION_EXPORT_TO_MAIL); 
      intent.putParcelableArrayListExtra(CommaSeparatedValuesService.EXTRA_RESULT, toExport); 
      startService(intent); 
    } else 
     Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_results_to_export) 
       , Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == REQUEST_EXTERNAL_STORAGE) 
     if((grantResults[0] != PackageManager.PERMISSION_GRANTED) && 
       (grantResults[1] != PackageManager.PERMISSION_GRANTED)) 
      Toast.makeText(getApplicationContext(), "This application need permissions to external storage", Toast.LENGTH_LONG).show(); 
} 

我CommaSeparatedValuesService看起來像 -

package com.example.user.trackyournevi.services; 

import android.app.IntentService; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Environment; 
import android.support.annotation.Nullable; 

import com.example.user.trackyournevi.bl.ResultsExport; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 

public class CommaSeparatedValuesService extends IntentService{ 

public static final String ACTION_EXPORT_TO_MAIL = "com.example.user.trackyournevi.services.action.ACTION_EXPORT_TO_MAIL"; 

public static final String EXTRA_RESULT = "com.example.user.trackyournevi.services.extra.PARENT"; 
public static final String EXTRA_TRASHED = "com.example.user.trackyournevi.services.extra.TRASHED"; 

public static final String COMMA_DELIMITER = ","; 
public static final String NEW_LINE_SEPERATOR = "\n"; 

public static final String CSV_FILE_HEADER = "Scan date" + COMMA_DELIMITER + "Organ" + COMMA_DELIMITER 
     + "Side" + COMMA_DELIMITER + "Recommendation" + COMMA_DELIMITER + "Changes" + NEW_LINE_SEPERATOR; 

/** 
* Creates an IntentService. Invoked by your subclass's constructor. 
* 
* @param name Used to name the worker thread, important only for debugging. 
*/ 
public CommaSeparatedValuesService(String name) { 
    super(name); 
} 

@Override 
protected void onHandleIntent(@Nullable Intent intent) { 
    if(intent != null) { 
     final String action = intent.getAction(); 
     if(ACTION_EXPORT_TO_MAIL.equals(action)) { 
      boolean trashed = intent.getBooleanExtra(EXTRA_TRASHED, false); 
      ArrayList<ResultsExport> results = intent.getParcelableArrayListExtra(EXTRA_RESULT); 
      handleActionExport(results, trashed); 
     } 
    } 
} 


public void handleActionExport(ArrayList<ResultsExport> results, boolean trashed) { 

    String path = null; 
    try { 
     path = writeToCSVFile(results); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    sentAttachedMail(path); 
} 

private static String writeToCSVFile(ArrayList<ResultsExport> results) throws IOException { 

    File patternDirectory = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()+"/com.example.pattern1/myfile.txt"); 
    patternDirectory.mkdirs(); 

    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream (new File(patternDirectory.getAbsolutePath().toString()), true); // true will be same as Context.MODE_APPEND 
     fos.write(CSV_FILE_HEADER.getBytes()); 
     fos.write("\n".getBytes()); 
     Iterator<ResultsExport> it = results.iterator(); 

     while (it.hasNext()) { 
      ResultsExport r = it.next(); 
      fos.write(r.getScanDate().getBytes()); 
      fos.write(COMMA_DELIMITER.getBytes()); 
      fos.write(r.getOrgan().toString().getBytes()); 
      fos.write(COMMA_DELIMITER.getBytes()); 
      fos.write(r.getSide().getBytes()); 
      fos.write(COMMA_DELIMITER.getBytes()); 
      fos.write(r.getRecommendation().getBytes()); 
      fos.write(COMMA_DELIMITER.getBytes()); 
      fos.write(r.getChanges().getBytes()); 
      fos.write(NEW_LINE_SEPERATOR.getBytes()); 
      fos.close(); 
     } 
    } catch (FileNotFoundException e) {e.printStackTrace();} 


    return patternDirectory.getAbsolutePath().toString(); 
} 

private void sentAttachedMail(String path) { 
    Intent email = new Intent(Intent.ACTION_SEND); 
    email.setType("text/plain"); 
    email.putExtra(Intent.EXTRA_SUBJECT, "My Scannings"); 
    email.putExtra(Intent.EXTRA_STREAM, Uri.parse(path)); 
    email.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(Intent.createChooser(email , "Email:")); 
} 


} 

是有人可以解釋我什麼在此代碼撥錯? TNX

+0

'有人可以解釋我什麼撥錯在這段代碼'? ??你應該告訴你的代碼出了什麼問題。您發佈了太多的代碼來處理emai發送問題。 – greenapps

回答

0

試試這個:添加setType並確保您的URI不爲空

Intent email = new Intent(Intent.ACTION_SEND); 
    email.setType("text/plain"); 
    email.putExtra(Intent.EXTRA_SUBJECT, "My Scannings"); 
    email.putExtra(Intent.EXTRA_STREAM, Uri.parse(path)); 
    email.setType("message/rfc822"); 
    startActivity(Intent.createChooser(email , "Email:")); 
+0

我按照你的建議添加了這一行,但沒有任何反應 –

相關問題