2013-10-05 59 views
0

我正在向文件寫入數字,並且希望將該文件發送至電子郵件。 該文件通過電子郵件收到,但是爲空。發送時電子郵件中未附加文件

但是,當我看着「data/data/com.example.write_file/files/samplefile.txt」文件是 好的,我的記錄被寫入。

有人知道我做錯了嗎?

package com.example.write_file; 

+import java.io.FileOutputStream; 

public class MainActivity extends Activity { 
private EditText getInput;  
    int D; 
    String W; 
    char chr; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   

    setContentView(R.layout.activity_main); 
    getInput = (EditText) findViewById(R.id.getInput);  
    D=0; 
    TextView textView1 = (TextView) findViewById(R.id.textView1); 
    textView1.setText("Write a number you want to send in the txt file") ; 

} 

public void onClick(View view) {   

    write_file();  

    D=D+1; 
    W=getInput.getText().toString(); //will get a string 
    if (getInput.getText().length() > 0){  
     chr=W.charAt(0);} //W convert to char 
     switch (view.getId()) { 
     case R.id.button1: 
      if (((chr==(char)45)&&(getInput.getText().length() < 2))||(getInput.getText().length() == 0)){    
      Toast.makeText(this, "Please enter a text", 
       Toast.LENGTH_LONG).show();    
      return; 
      } 

      TextView getInput1 = (TextView) findViewById(R.id.textView1); 
      getInput1.setText("Write a number you want to send in the txt file") ; 
      break;     }       

} 

public void onClick2(View view) {  
sendfile(); 
finish(); 
}  

public void write_file() { //writes into local not to a sdcard 

    try { // catches IOException below    
     FileOutputStream fOut = openFileOutput("samplefile.txt",MODE_APPEND); 
     OutputStreamWriter osw = new OutputStreamWriter(fOut);    
     osw.append(W + "\n"); // Write the string to the file - "\n" similar to writeln in pascal (use wordpad not notepad) 

     osw.flush(); 
     osw.close(); 

     if (D>=55) { finish();} 

     Toast.makeText(this, "I am writing to the file", 
     Toast.LENGTH_SHORT).show(); 
     // the file you can find in DDMS-File Explorer-"/data/data/your_project_package_structure/files/samplefile.txt" 
     // there is an icon mobile phone for pulling file from device or putting file onto device  
} 
    catch (IOException ioe) 
    {Toast.makeText(this, "Exception-file not exists?", 
      Toast.LENGTH_SHORT).show();} 
} 
/*  
public void sendfile(){ 
    String nfile; 
    nfile="samplefile.txt"; 
    Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.setType("text/plain"); 
    emailIntent.putExtra(android.content.Intent.ACTION_SENDTO, new String[] 
      {"[email protected]"}); 
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, 
    "File attached."); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("data/data/com.example.write_file/files"+ nfile)); 
     startActivity(Intent.createChooser(emailIntent, 
    "Send email using..")); 

    Toast.makeText(this, "The file was sent", 
      Toast.LENGTH_SHORT).show(); 

} */ 
public void sendfile(){ 
    Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.setType("text/plain"); 
    emailIntent.putExtra(android.content.Intent.ACTION_SENDTO, new String[] 
      {"[email protected]"}); 
    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, 
    "File attached."); 
    File file = getFileStreamPath("samplefile.txt"); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+file.getAbsolutePath())); 
     startActivity(Intent.createChooser(emailIntent, 
    "Send email using..")); 

    Toast.makeText(this, "The file was sent", 
      Toast.LENGTH_SHORT).show(); 

} 
}  

**in the manifest I put:** 
<provider 
android:name="android.support.v4.content.FileProvider" 
android:authorities="com.example.write_file" 
android:exported="false" 
android:grantUriPermissions="true"> 
<meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/my_path" /> 
</provider> 
    <activity 
     android:name="com.example.write_file.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

**and in the my_path.xml :** 
<paths> 
<files-path name="files" path="files/"/>  
</paths> 

回答

3

首先,第三方應用程序無法訪問您的內部存儲。將文件寫入外部存儲器或try FileProvider以提供對內部存儲器的選擇性訪問。

二,從不硬編碼路徑。您的代碼在許多Android設備上都會失敗。使用getFilesDir()getFileStreamPath(),而不是硬編碼data/data/com.example.write_file/files

+0

我編輯了代碼(上面),但它仍然不起作用。你能查看現在有什麼問題嗎?謝謝 – user2556278

+0

他還在UIThread中完成所有工作...... – m0skit0

+0

@ user2556278:正如我寫的,第三方應用程序無法訪問您的內部存儲。將文件寫入外部存儲器或嘗試使用「FileProvider」來提供對內部存儲的選擇性訪問。 – CommonsWare

0

您必須使用外部存儲來發送電子郵件。如果您確實使用當前正在執行的應用程序數據文件路徑,那麼您將獲得權限被拒絕的異常。

取而代之的是將文件保存在外部存儲器中,然後將其發送到使用意圖。