2016-08-22 72 views
0

我正在使用我的應用程序中的反饋功能,用戶應該從圖庫中選擇圖像並鍵入他的消息並按發送按鈕,發送按鈕時單擊代碼應該是從框中獲得文本(下圖),並將其附加到電子郵件意圖併發送整個事情,一切似乎工作得很好,直到我得到「無法附上空文件」吐司消息,這是我多遠得到了在代碼Android - 將圖像附加到電子郵件

String rating = String.valueOf(RateBar.getRating()); 
      String subject = Feedback.getText().toString(); 
      String FileLocation = FilePathPreview.getText().toString(); 
      String to ="[email protected]"; 
      String message = UserInput.getText().toString(); 
      String body = "Rating : "+rating+" out of 5"+ 
        "\n "+message; 
      Intent email = new Intent(Intent.ACTION_SEND); 
      email.putExtra(Intent.EXTRA_EMAIL, new String[]{to}); 
      email.putExtra(Intent.EXTRA_SUBJECT, subject); 
      email.putExtra(Intent.EXTRA_TEXT, body); 
      email.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:/"+FileLocation)); 

      //need this to prompts email client only 
      email.setType("message/rfc822"); 

      startActivity(Intent.createChooser(email, "Choose an Email client :")); 

public void grabImg(){ 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, 
      "Select Picture"), SELECT_PICTURE); 
} 
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
     if(resultCode == RESULT_OK){ 
      Uri selectedImage = imageReturnedIntent.getData(); 
      String PathP = selectedImage.getPath().toString(); 
      FilePathPreview.setText(PathP); 
     } 
} 

Feedback activity

+0

我想預先等待'file:/'是什麼破壞你的代碼。嘗試擺脫這一點。 – theFunkyEngineer

+0

'String PathP = selectedImage.getPath()。toString();'是無用的,除非'Uri'的方案可能是'file'。另外,請記住,ACTION_SEND支持* EXTRA_TEXT *或EXTRA_STREAM *,但不一定是兩者。 – CommonsWare

+0

'String FileLocation = FilePathPreview.getText()。toString();'你沒有告訴它什麼。你當然應該。 – greenapps

回答

2

創建globale Uri變量然後保存URI在onActivityResult()

Uri uri = null; 

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
     if(resultCode == RESULT_OK){ 
      Uri selectedImage = imageReturnedIntent.getData(); 
      uri = selectedImage; // here set the uri 
      String PathP = selectedImage.getPath().toString(); 
      FilePathPreview.setText(PathP); 
     } 
} 

那麼同樣uri變量傳遞給

 //.... 
     email.putExtra(Intent.EXTRA_STREAM, uri); 
     //.... 
     //need this to prompts email client only 
     email.setType("message/rfc822"); 

     startActivity(Intent.createChooser(email, "Choose an Email client :")); 

更新:,如果你仍然無法分享添加這個標誌

email.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

+0

'Intent'可能還需要添加'FLAG_GRANT_READ_URI_PERMISSION'作爲標誌。否則'ACTION_SEND'實現可能沒有權限給'Uri'。 – CommonsWare

+0

@CommonsWare請提供代碼如何以及在何處添加權限 –

+0

@CommonsWare他應該在讀取圖像時閱讀存儲許可....他是否還需要'FLAG_GRANT_READ_URI_PERMISSION'? –

1

試試這個方法。

Uri selectedImageUri = data.getData(); 
String PathP; 
Cursor cursor = getContentResolver().query(selectedImageUri, null, null, null, null); 
if(cursor != null) 
{ 
    cursor.moveToFirst(); 
    int idx =cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    PathP = cursor.getString(idx); 
    cursor.close(); 
}