KitKat的GMail在发送非图像或视频的附件时崩溃

时间:2013-11-23 11:32:06

标签: android android-intent nullpointerexception gmail

更新3: 似乎这一切都是由OTA升级到KitKat 4.4引起的。强制停止和清除GMail应用程序的数据解决了这个问题。不是用户友好的OTA更新结果。

更新2: 崩溃完全是由于Android 4.4 KitKat中新的Gmail文件处理造成的。当添加任何其他文件类型作为附件而不是图像或视频时,GMail会在发送电子邮件时崩溃。为什么要删除其应用的功能?

任何人都知道在哪里举报GMail错误?我可以通过使用GMail(而不是我自己的代码)来重现崩溃:

  1. 撰写新电子邮件

  2. 添加附件(只有2个选项:“附加图片”或“附加视频”)

  3. 选择其中一个。

  4. 选择文件浏览器(如ES文件浏览器)选择zip / apk / ...(或其他非图像/视频文件)

  5. Gmail在发送邮件时崩溃。

  6. 更新

    崩溃发生在我的Nexus 4运行官方(OTA)KitKat上。 但是,在我的三星Galaxy S2上运行相同的代码每晚运行CM10.2(Jelly Bean)工作正常。它也适用于运行4.0.4的三星Galaxy Tab 2.

    KitKat上的GMail是否被破坏?

    Nexus 4有GMail版本4.6.1(920375) Galaxy S2有GMail版本4.6(836823)

    原始问题(已解决,请参阅更新3):

    我的Android应用程序中有以下代码:

    Intent email = new Intent(Intent.ACTION_SEND);
    email.putExtra(Intent.EXTRA_EMAIL, new String[]{"xxx@gmail.com"});
    email.putExtra(Intent.EXTRA_SUBJECT, "MetroNavigator data");
    email.setType("application/zip");
    email.putExtra(Intent.EXTRA_TEXT, "This email contains tracking data generated by the MetroNavigator app.");
    email.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getAbsolutePath()));
    
    startActivity(Intent.createChooser(email, "Choose a mail client to send the data:"));
    

    这似乎很有效,因为zip文件已正确添加到电子邮件中(您可以看到,因为GMail提到了文件大小,如果文件路径错误则不会这样。)

    屏幕截图:(我还没有10个代表,所以无法嵌入) http://i.imgur.com/UkMQZLG.png

    然而,GMail在发送邮件时崩溃,提供以下输出:

    11-23 12:22:38.451  31900-32089/? E/AndroidRuntime﹕ FATAL EXCEPTION: SyncAdapterThread-1
    Process: com.google.android.gm, PID: 31900
    java.lang.NullPointerException
            at android.content.ContentResolver.openInputStream(ContentResolver.java:613)
            at com.google.android.gm.provider.MailEngine$PublicMailStore.getInputStreamForUploadedAttachment(MailEngine.java:5591)
            at com.google.android.gm.provider.MailSync$AttachmentPartSource.newInputStream(MailSync.java:3968)
            at com.google.android.gm.provider.MailSync$AttachmentPartSource.<init>(MailSync.java:3941)
            at com.google.android.gm.provider.MailSync$ProtoOperationSink.messageSavedOrSent(MailSync.java:3708)
            at com.google.android.gm.provider.Operations.provideNormalOperations(Operations.java:586)
            at com.google.android.gm.provider.MailEngine$PublicMailStore.provideOperations(MailEngine.java:5290)
            at com.google.android.gm.provider.MailSync.nextSyncRequest(MailSync.java:853)
            at com.google.android.gm.provider.MailEngine.runSyncLoop(MailEngine.java:2217)
            at com.google.android.gm.provider.MailEngine.sync(MailEngine.java:2014)
            at com.google.android.gm.provider.MailEngine.performBackgroundSync(MailEngine.java:1936)
            at com.google.android.gm.provider.MailSyncAdapterService$SyncAdapterImpl.onPerformLoggedSync(MailSyncAdapterService.java:58)
            at com.google.android.common.LoggingThreadedSyncAdapter.onPerformSync(LoggingThreadedSyncAdapter.java:33)
            at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)
    

    我已阅读其他与您无法从内部存储上传附件的附件相关的问题,但我使用

    Environment.getExternalStorageDirectory().toString();
    

    作为每条路径的基础,我已经包含了

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

    在我的清单中。它也是崩溃的GMail应用程序而不是我自己的应用程序。有任何想法吗?这是GMail中的错误吗?

    会喜欢这里的一些意见。

    提前致谢,

    托马斯

3 个答案:

答案 0 :(得分:12)

就像我原来问题的更新3中提到的那样,罪魁祸首是一个损坏的Gmail应用程序。清除数据可以解决问题。

答案 1 :(得分:2)

更改代码:

Uri.parse("file://" + file.getAbsolutePath()));

要:

Uri.fromFile(file)

答案 2 :(得分:0)

我卸载了Gmail应用并重新安装了它,一切都开始为我工作了。