2016-08-22 75 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(); 
}