【问题标题】:Sending mms in android 4.4在 android 4.4 中发送彩信
【发布时间】:2014-09-23 14:19:45
【问题描述】:

我正在尝试仅从我的应用程序发送彩信。在 android 开发者教程 (http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html) 的帮助下,我将其设为默认消息传递应用程序。

我的清单:

BroadcastReceiver 监听传入的 SMS 消息:

   <receiver android:name="com.test.SmsReceiver"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_DELIVER" />
        </intent-filter>
    </receiver>

BroadcastReceiver 监听传入的 MMS 消息

 <receiver android:name="com.test.MmsReceiver"
        android:permission="android.permission.BROADCAST_WAP_PUSH">
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
    </receiver>

通过电话快速响应传递消息的服务

<service android:name="com.test.HeadlessSmsSendService"
        android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </service>

NewMmsActivity 允许用户发送新 SMS/MMS 消息的活动:

 <activity android:name="com.test.NewMmsActivity"
        android:configChanges="keyboard|keyboardHidden|locale|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </activity>

但是当我尝试在 NewMmsActivity 中发送彩信时,它不起作用,而是像这样打开对话框:

代码:

  Intent mmsIntent = new Intent(Intent.ACTION_SEND);
  mmsIntent.putExtra("sms_body", "text");
  mmsIntent.putExtra("address", "99999999");
  mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(fileString)));
  mmsIntent.setType("image/jpeg");
  startActivity(mmsIntent);

如果我使用 Intent.ACTION_SENDTO 什么都不会发生。 Intent 启动时没有问题,但什么也没有发生。

我错过了什么?

【问题讨论】:

  • 您能否详细说明“不起作用”。你有错误吗?图片不显示?
  • @RyPope:什么也没发生。 Intent 启动,但没有发送任何内容。
  • 好的,试试我的答案

标签: android telephony mms


【解决方案1】:

作为默认应用程序,您的应用程序负责发送彩信本身,而不是打开另一个应用程序来执行此操作,这就是您的代码正在做的事情。目前,Android 没有像 SMS 那样简单的 MMS API。此外,它是框架的一个非常缺乏文档记录的方面,实现它所需的代码量和解释超出了 Stack Overflow 的范围。欢迎您查看本机应用程序的源代码以获取指导,但请记住,这并非易事,因为默认应用程序负责处理 MMS 所需的一切,包括发送、接收和内容提供程序事务。

【讨论】:

  • 但是如果不可能的话,为什么会有“mmsto:”之类的方案呢?
  • 我并没有说这不可能,只是它不是微不足道的,你的应用程序必须处理它,这就是为什么你的NewMmsActivity 在其&lt;intent-filter&gt; 中包含该方案。跨度>
  • 该博客页面(几乎每个人都在尝试为 KitKat 更新 SMS 应用程序时引用)相当具有误导性,因为它忽略了 MMS 操作从未​​在 Android 中轻松实现,即使任何应用程序意味着默认必须处理它们。
【解决方案2】:

我认为问题在于您尝试发送图像和文本数据,但您的类型设置为图像。 尝试将其改为:

mmsIntent.setType("*/*");

【讨论】:

  • 不起作用。我也尝试从 ACTION_SEND 更改为 ACTION_SENDTO,因为 ACTION_SEND 打开选择对话框并且没有任何反应。
  • 对话框中什么也没有出现?
【解决方案3】:

我发现发送彩信最简单的方法是在此处找到的 android-smsmms 库:https://github.com/klinker41/android-smsmms

获取我使用的 mmsc、代理和端口:

 final Cursor apnCursor = SqliteWrapper.query(mContext, this.mContext.getContentResolver(),
                Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), APN_PROJECTION, null, null, null);
        String type = null;
        if (apnCursor.moveToFirst()) {
            do {
                type = apnCursor.getString(3);
                if(type.equals("default,supl,mms") ||
                        type.equals("mms")) {
                    mmsc = apnCursor.getString(0);
                    proxy = apnCursor.getString(1);
                    port = apnCursor.getString(2);
}while (apnCursor.moveToNext());

在 if 循环中,我正在检查 APN 是否有我需要的彩信数据,否则转到下一个。

【讨论】:

  • 如何从android获取Mmsc、Port和Proxy?
  • 你如何获得隐藏类SqlliteWrapper的访问权限?我尝试通过ContentResolver 执行此操作,但只有我得到 原因:java.lang.SecurityException:无写入 APN 设置的权限:用户 10656 和当前进程都没有 android.permission.WRITE_APN_SETTINGS。
  • 您可以在我上面发布的 smsmms 库中找到这些文件(或者您自己从 Android 源代码中获取它们)。因此,当您制作 SqlliteWrapper 对象时,请确保它是 smsmms 库之一。
  • 在我将它从 git 的 android soucre 更改为 sqliteWrapper 后,我仍然得到那个异常,这个权限是系统权限,所以我无法得到它
  • 也许尝试将您的应用设置为默认消息应用?
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多