Oreo 8.0 -“sendTextMessage()”未将消息保存到已发送文件夹

2024-07-01

我尝试使用“sendTextMessage”或“sendMultipartTextMessage”从我自己的应用程序发送短信。对于高于 API 19 (KitKat) 的手机,此消息将保存到已发送文件夹中。然而,在我的 Android 8.0 Oreo 手机上,它没有保存到已发送的项目中。

我创建了一个非常基本的测试应用程序,以便在此处发布。该应用程序将简单地检查权限并在 MainActivity 的 Resume 功能触发时发送文本。这是代码。

显现:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.focus4software.www.myapplicationtest">

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

构建.Gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.focus4software.www.myapplicationtest2"
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

主要活动:

package com.focus4software.www.myapplicationtest;

import android.Manifest;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Telephony;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_RESULTCODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onResume(){
        super.onResume();


        //Check Permissions first
        if (android.os.Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
                //Permissions not found..  request them
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_RESULTCODE);
            }
            else {
                this.SendSMS();
            }
        }
        else {
            this.SendSMS();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_RESULTCODE: {
                if (grantResults.length == 1) {
                    //Make sure none of the permissions were denied
                    boolean somethingDenied = false;
                    for (int result : grantResults){
                        if (result != PackageManager.PERMISSION_GRANTED){
                            somethingDenied = true;
                        }
                    }

                    if (somethingDenied){
                        //a permission was denied
                        Toast.makeText(getApplicationContext(), "Failed to Send The TEST SMS, Permission was denied", Toast.LENGTH_SHORT).show();
                    }
                    else {
                        //turn the app on.. permissions accepted
                        this.SendSMS();
                    }
                }
                else {
                    Toast.makeText(getApplicationContext(), "Failed to Send The TEST SMS, incorrect amount of permissions returned.", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }

    private void SendSMS (){
        String phone = "[INSERT PHONE NUMBER]";
        String message = "InCodeTestExtra";

        //send sms
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phone, null, message, null, null);

        //Show we got here
        Toast.makeText(getApplicationContext(), "Code Executed...  SMS Passed on.", Toast.LENGTH_SHORT).show();

        //Save SMS
        //this.SaveSMS(getApplicationContext(), phone, message);
    }

    private void SaveSMS(Context inContext, String inAddress, String inBody) {
        try {
            ContentValues values = new ContentValues();
            values.put("address", inAddress);
            values.put("body", inBody);
            values.put("read", 1);
            values.put("date", System.currentTimeMillis());
            //values.put("status", delivered);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Uri uri = Telephony.Sms.Sent.CONTENT_URI;
                inContext.getApplicationContext().getContentResolver().insert(uri, values);
            }
            else {
                inContext.getApplicationContext().getContentResolver().insert(Uri.parse("content://sms/sent"), values);
            }

            //notify of the save
            Toast.makeText(getApplicationContext(), "SMS SAVED (Maybe)", Toast.LENGTH_SHORT).show();
        } catch (Exception ex) {
            //notify of the Failure
            Toast.makeText(getApplicationContext(), "SMS Failed to save (" + ex.getMessage() + ")", Toast.LENGTH_SHORT).show();
        }
    }
}

如前所述,这不会将消息保存到我的 Android Oreo 手机的发送文件夹中。

根据 Android 文档,这是注定要发生的。

注意:从 Android 4.4(API 级别 19)开始,当且仅当应用程序 未选为默认短信应用,系统自动 将使用此方法发送的消息写入 SMS 提供程序( 默认短信应用程序始终负责将其发送的消息写入 短信提供商)。有关如何表现得默认的信息 SMS 应用程序,请参阅电话。

作为解决方法,我尝试手动保存消息。在 SendSMS 函数的底部,这被注释掉了。但是,运行此代码不会导致异常,但也不会将短信保存到发送文件夹。这在旧手机上也能正常工作。我不确定这是否是一个相关问题。

我在这里错过了什么吗?有人可以帮忙吗? :)


只是想将此线程更新为我发现的内容。

看来 Mike M 是正确的,因为这是特定于某些型号的。我使用的是 Honor 9,另一个堆栈溢出用户在 p20 lite 上也遇到了类似的问题。都是 Hwawei。我对许多非华为的型号进行了许多测试,但从未成功复制过该问题。

正如我的问题中提到的,如果短信不存在,使用代码手动保存短信也无法保存短信……也许这对这种情况下的其他用户有效。

我发现唯一有效的解决方法是显示短信活动并让用户自己发送短信。缺点是它需要用户输入,您只需填充 SMS 活动即可让他们发送消息。 这是关于如何做到这一点的有用链接:有目的地启动短信应用程序 https://stackoverflow.com/questions/2372248/launch-sms-application-with-an-intent

对于有类似问题的人来说,可以只弹出短信活动某些带有一些时髦代码的型号..或者通过尝试保存虚拟短信并查看它是否有效来检测是否存在此问题(如果有效,请记住将其删除)工作)..如果失败则显示短信活动......

IMO 每个解决方法都是令人不安的混乱,我愿意接受任何人的任何建议。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oreo 8.0 -“sendTextMessage()”未将消息保存到已发送文件夹 的相关文章

  • INSTALL_FAILED_MISSING_SHARED_LIBRARY 没有 google api

    好吧 我一直在浏览 但我最终得到的只是谷歌的 api 我没有在我的应用程序中使用任何来自谷歌的API 我正在编写一个使用 sqlite 浏览器的应用程序 但尚未使用任何其他参考 任何想法 我之前没有开始过这个应用程序 所以现在这是一个非常大
  • 是否可以从 Linux CLI 编译适用于 Android 的 Xamarin?

    我们有一个 Android 应用程序 它根据每个客户端使用自定义信息进行编译 目前 我们的应用程序是使用 Ionic 构建的 因此当用户要求下载 APK 时 我们会自动相应地修改其源代码 编译应用程序并提供从客户端的下载 所有这一切都是在
  • 将 Android SDK 工具更新至修订版 14 后出现 Ant 问题

    安装 Android SDK 工具修订版 14 执行 ant version 时为 ant 版本 1 8 2 以在 Android 4 0 ICS 上安装和测试我们的应用程序后 我注意到我们的自动构建脚本现在失败了 构建脚本正在执行 ant
  • 使用 Flink 监控数据流目录中的新文件

    我目前正在编写我的第一个 Flink 应用程序 并且想要监视文件夹中的新文件 不幸的是我找不到关于这个主题的很多例子 我找到了readFile fileInputFormat path watchType interval pathFilt
  • Android 定期运行任务

    我想在 android 活动中定期运行一个方法 该方法会在 x 秒后更新某个字段 我知道它可以在timerTask中完成 但是最好的方法是什么 代码示例会很有帮助 你应该使用Handler和它的postDelayed功能 您可以在这里找到示
  • UserRecoverableAuthException:NeedPermission

    我尝试按照教程进行操作 https developers google com android guides http auth https developers google com android guides http auth Co
  • 在 onClick 处理程序的活动类 [...] 中找不到方法 [...](View)

    当我按下按钮时fragment main xml 出现这个错误 java lang IllegalStateException Could not find a method sendMessage View in the activity
  • android获取屏幕尺寸包括状态栏和软件导航栏的尺寸

    如何获取包含导航栏和状态栏的屏幕尺寸 以像素为单位 我已经尝试过使用获取尺寸DisplayMetrics但尺寸不包括软件导航栏 自 API 17 JELLY BEAN MR1 起添加了软件导航 因此我们只需要在 API 17 及更高版本中包
  • 更改 Android 中的配对对话框外观

    我们有一个与 BLE 设备 我们也生产 配对的 Android 应用程序 但默认的 Android 配对对话框存在一些问题 问题是 我们的设备不需要访问联系人或通话记录 是否可以删除该选项 无论是否选中该框 配对和我们的功能都将起作用 但我
  • 无法解析 styles.xml 中的符号“Theme.AppCompat.Light.DarkActionBar”

    Theme AppCompat Light DarkActionBar is not compiling in styles xml I have added compile com android support appcompat v7
  • 批处理脚本 - 如果存在 ./sdcard/file.any 使用 adb

    我想检查我的 Android 设备上是否存在文件 如果不存在 则推送它 使用 adb 批量执行此操作的语法是什么 就像是 if exist sdcard file any do echo exists else adb push file
  • 三星我的文件资源管理器:从指定文件夹中选取文件

    我使用以下代码打开三星的 我的文件 应用程序来选择文件 public void openFileBrowser Intent intent new Intent com sec android app myfiles PICK DATA t
  • 如何在没有丑陋的instanceof的情况下处理Retrofit Rx onError中的不同类型的错误

    我想知道您在改造 Rx onError 中处理不同类型的错误 如 http 异常 无互联网连接异常等 而不使用instanceof就像这里建议的那样 如何使用 RxJava 处理 Retrofit 2 中的网络错误 https stacko
  • Java双精度求和问题

    我想知道为什么我会收到此错误 这是Eclipse调试的显示日志 var double 2 8 tot getIva java lang Double 0 17 var tot get double 2 9699999999999998 我不
  • RMI服务器异常

    当我尝试运行使用远程注册表的服务器时 我收到以下来自 RMI 的异常 我的 Server2 类中 main 方法的注册表代码是 Registry registry LocateRegistry getRegistry 192 168 1 4
  • CodenameOne 在构建后停止工作

    我对 codenameone 有一个奇怪的问题 我什至不确定出了什么问题 我尝试过 发送 Windows Phone 版本 并且从那时起我认为我没有更改任何其他内容 然而 在我这样做之后 模拟器无法启动并一直说我的导入是错误的 事实并非如此
  • Java:Set接口和Collection接口的区别

    我刚刚查了一下Set接口 发现它大部分 或完全 只重新声明已经存在于Collection界面 Set本身延伸Collection 所以这是否意味着Set界面自动具有所有功能Collection 那么为什么要重新声明它们呢 例如 Set重新声
  • 在这种情况下是否违反了 Google Play 开发者政策? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想通过 Android 应用程序赚一些钱 但我面临一个大问题 Google 在 Google Play 上不支持我所在的国家 地区 适用
  • 允许轻松打印字节码指令*包括*参数的库

    我正在寻找一个图书馆easily让我查看方法的给定字节码 例子 ALOAD 0 INVOKEVIRTUAL ns c m I IRETURN 我都尝试过 ASM 我实际上可以让它打印指令和参数 但是我很难理解它的整个访问者范例 也就是说 我
  • Java将浮点字符串解析为浮点数组?

    有没有一种简单的方法将浮点字符串解析为浮点数组 我正在编写一个导入程序 它需要解析一个 ascii 文件以获取一些值 我只是想知道是否有更简单的方法来执行此操作 然后自己搜索所有空白并使用Float parseFloat s 对于每个空格分

随机推荐

  • Jenkins 管道脚本未运行

    对于下面的管道脚本 Helo World 未打印 甚至节点也没有被分配 pipeline agent any stages stage Example steps echo Hello World 安装了 Pipeline Declarat
  • 为什么当缩放改变时,具有相同高度的元素“看起来”不同?

    基本上 要点就在主题中 当我创建两个具有固定高度 2px 的相同 div 并将缩放更改为 75 或 125 时 由于某种原因它们 看起来 不同 有人可以解释一下这里发生了什么吗 我该如何解决这个问题 gradient slider line
  • 当我使用 iText 从 PDF 文件中提取文本时,我从前一页获取值

    我正在尝试从多页 PDF 文件中每个页面的特定位置提取文本块 我知道文本的位置 并且能够在第一页上正确提取它 然而 在第一页之后的页面上 提取的文本似乎正在累积 例如 如果第 1 页上的文本值为 A 第 2 页为 B 第 3 页为 C 那么
  • 如何使用 scipy.spatial.Delaunay 查找 delaunay 三角剖分中给定点的所有邻居?

    我一直在寻找这个问题的答案 但找不到任何有用的东西 我正在使用 python 科学计算堆栈 scipy numpy matplotlib 并且我有一组二维点 我为其计算 Delaunay 训练 wiki https en wikipedia
  • Python 中的双 SSH 隧道

    今天 我在命令行中使用 ssh 将端口从远程服务器转发 使用中间服务器到我的本地计算机 这是我在 shell 中使用的命令 ssh user remote server L 2443 localhost 433 此 ssh 会话使用 ssh
  • 如何将组添加到多个内置功能区选项卡 (vsto)?

    这是 VS2010 Office 2010 加载项 我想要的只是添加一个按钮 或按钮组 到多个内置选项卡 例如 我的按钮应该在两个中都可用新邮件消息功能区 and in 新预约丝带 我尝试添加一个新选项卡 在视觉设计器中 但这似乎不起作用
  • 使用本地文件作为

    是否可以使用用户硬盘中的音频文件作为srcHTML5 的属性
  • 未知的 UTF-8 代码单元闭合双引号

    我的问题如下 我正在读取一个 XML 文件 其文本节点部分包含 UTF 8 版本的打开和关闭双引号 文本被提取 缩短为 3999 字节并放入新的 XML 格式 然后保存为文件 虽然 Notepad 在输入文件中正确显示了这两个符号 但输出文
  • d3.js 结合分层边缘捆绑和径向 Reingold–Tilford 树 + 数据

    我想 某种程度上 结合分层边缘捆绑 http bl ocks org mbostock 7607999和径向 Reingold Tilford 树 http bl ocks org mbostock 4063550 It would loo
  • 将函数参数传递给公式

    我试图理解为什么 foo function d y x fit with d lm y x foo myData Y X 不起作用 例如 myData data frame Y rnorm 50 X runif 50 对我来说似乎棘手的一点
  • 如何将嵌套模块与传单地图一起使用

    我正在尝试使用shiny模块来构建一个应用程序leaflet地图 然而 当我运行下面的代码时 地图无法正确渲染 它呈灰色 我希望发生的是user从侧面板中选择城市 并显示地图的相关部分 问题末尾有一个使用标准闪亮来说明的示例 我认为用户输入
  • 如何对 array_chunk 中的元素进行分组

    我在 joomla 中创建模块时遇到问题 我的 php 技能受到限制 我使用 foreach 显示模板文件中的元素 div show information gt gt 我如何使用 array chunk 将 3 个元素分组到一个 div
  • Samsung Galaxy J1 4G 上的 webRTC 应用程序崩溃

    我正在开发视频通话 Android 应用程序 该应用程序可以在 Nexus 4 Moto g2 Moto g3 Moto e 等设备上进行视频通话 但当我在 Samsung Galaxy J1 4G 上拨打电话时 它崩溃了 这是堆栈跟踪 E
  • Python 文件打开并立即关闭

    尝试首先通过 powershell 然后通过 cmd 运行此代码 甚至简单地单击它 我正在输入 start python myfile py 来运行它 在每种情况下 文件都会在屏幕上闪烁并立即关闭 我查看它的唯一方法是将文件直接拖到cmd中
  • 如何反向遍历 C# 集合?

    是否有可能有一个foreach将以相反顺序遍历 Collections 对象的语句 如果不是foreach声明 还有其他方法吗 你可以用普通的for向后循环 如下所示 for int i collection Count 1 i gt 0
  • 如何获取 Tkinter 标签文本?

    我正在制作一个用户将从中选择的地址列表 并且将返回地址文本 我需要使用Tkinter Label因为Tkinter Listbox不允许换行 关键是没有 get Label 类中的类似方法 我知道我可以做类似的事情 v StringVar
  • 在进程之间共享列表的正确方法?

    我想设置两个子流程 其中subprocess1不断生成数据 类型为list and subprocess2负责处理发来的数据subprocess1 I used multiprocessing Manager list 创建共享列表 但这是
  • 如何使用 Sublime Text 2 让rails_footnotes 打开文件?

    我不是问如何告诉脚注如何做到这一点 我在initializers footnotes rb file Footnotes Filter prefix txmt open url file s line d column d 我的问题是应该用
  • 如何在不缓冲的情况下从 WCF 流式传输响应?

    我有一个宁静的 webHttpBinding 自托管WCF服务 大多数方法都会向客户端返回 xml 或 json 版本的对象 我有几个触发长时间运行的方法的 GET 方法 我想将日志响应流式传输到浏览器 或应用程序 以便用户知道发生了什么
  • Oreo 8.0 -“sendTextMessage()”未将消息保存到已发送文件夹

    我尝试使用 sendTextMessage 或 sendMultipartTextMessage 从我自己的应用程序发送短信 对于高于 API 19 KitKat 的手机 此消息将保存到已发送文件夹中 然而 在我的 Android 8 0