我正在尝试开始使用我从资源中选择的图像发送mms。如果我尝试从手机存储中检索图像,此代码似乎工作正常,但如果我尝试从可绘制资源中检索图像,则无法找到该文件。我认为这与为了检索资源而没有正确创建Uri这一事实有关。
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendImage(View v)
{
Log.d("MainActivity", "send image button clicked");
Intent mmsIntent = new Intent(Intent.ACTION_SEND);
mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://com.example.android.imagesms/drawable/smile.jpg"));
mmsIntent.setType("image/jpg");
startActivity(mmsIntent);
}
}
如果我更换
mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://com.example.android.imagesms/drawable/smile.jpg"));
使用代码指定手机存储空间的位置:
mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("/storage/emulated/0/DCIM/Camera/smile.jpg")));
正确检索文件并且没有问题地启动意图。
答案 0 :(得分:1)
原因是,没有其他应用可以从您的应用访问或读取资产文件或可绘制文件。此类文件的范围仅限于您的应用。因此,您必须手动将所需文件从可绘制文件夹写入设备公共存储,然后触发意图。这样做可以使文件可用于所有其他应用程序(在您的案例消息应用程序中)。
假设您的drawable中有一张图像即ic_launcher。然后从这个图像中获取一个位图对象,如:
Bitmap bm = BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher);
可以使用以下方法检索SD卡的路径:
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
然后使用以下按钮单击按钮保存到SD卡:
File file = new File(extStorageDirectory, "ic_launcher.PNG");
outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
outStream.flush();
outStream.close();
不要忘记添加android.permission.WRITE_EXTERNAL_STORAGE
权限。