检索可绘制的资源以便在MMS中发送

时间:2017-01-16 06:51:07

标签: android android-intent

我正在尝试开始使用我从资源中选择的图像发送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")));

正确检索文件并且没有问题地启动意图。

1 个答案:

答案 0 :(得分:1)

原因是,没有其他应用可以从您的应用访问或读取资产文件或可绘制文件。此类文件的范围仅限于您的应用。因此,您必须手动将所需文件从可绘制文件夹写入设备公共存储,然后触发意图。这样做可以使文件可用于所有其他应用程序(在您的案例消息应用程序中)。

将图像从drawble资源保存到SD卡:

假设您的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权限。