草庐IT

安卓预览 M : activity recreates after permission grant

coder 2023-11-19 原文

我试用 Preview M 并在其上测试我的应用程序,尤其是“将文件保存到外部存储”部分。 在下载/保存过程开始之前,我请求

  Manifest.permission.WRITE_EXTERNAL_STORAGE

权限如开发者页面所述:https://developer.android.com/preview/features/runtime-permissions.html

对话按预期发生:

"Allow <AppName> to access photos, media, and files on your device?" Deny / Allow

如果我点击“拒绝”按钮,将调用 Activity 的 onRequestPermissionsResult 方法。

如果我按下“允许”按钮,首先会重新创建 Activity ,然后调用 onRequestPermissionsResult 方法。我认为这是授予权限的结果。

但是第二种情况比较棘手,因为我想触发一个开始下载的回调,但是此时这个对象是空的:

public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    getLogger().error("onRequestPermissionsResult ( " + requestCode + ", " + permissions + ", " + grantResults + " )");
    switch (requestCode) {


        //permission for saving files?
        case PermissionCode.WRITE_EXTERNAL_STORAGE: {


            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                //HERE IS THE NULL-OBJECT 
                if (controller != null) {

                    controller.triggerCallback();
                }
            }
            break;
        }
        default: {

            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

所以我的问题是:

  1. 我可以避免这种消遣吗?
  2. 如果不是,我该如何重新设计我的代码来解决问题——我现在完全没有想法

编辑 1:

我尝试使用处理程序和 postDelayed 解决问题 - 但我跳过了它。

编辑 2:

我初步解决了它并向用户展示了一个 Toast,请求再次按下下载按钮(在获得许可的情况下)。但是谷歌:你是认真的吗?

编辑 3:

最新的 SDK 6.0(版本 23)没有娱乐 Activity - 也许有人听到我在山景城的哭泣:-)

最佳答案

您始终可以在 onCreate() 中重新创建 Activity 后立即检查下载情况:

static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
boolean initiateDownload = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState != null) {
        initiateDownload = savedInstanceState.getBoolean("toDownload");
    }
}

@Override
public void onResume() {
    super.onResume();
    final boolean hasPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED;
    if(initiateDownload && hasPermission) {
        // start download here...
    } else {
        requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE},
                MainActivity.MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            initiateDownload = true;
        } else {
            // denied permission...
        }
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("toDownload", initiateDownload);
}

关于安卓预览 M : activity recreates after permission grant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31432534/

有关安卓预览 M : activity recreates after permission grant的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - Rake 预览在 Octopress 中不起作用 - 2

    我在我的机器上安装了ruby​​版本1.9.3,并且正在为我的个人网站开发一个octopress项目。我为我的gems使用了rvm,并遵循了octopress.org记录的所有步骤。但是我在我的rake服务器中发现了一些错误。这是我的命令日志。Tin-Aung-Linn:octopresstal$ruby--versionruby1.9.3p448(2013-06-27revision41675)[x86_64-darwin12.4.0]Tin-Aung-Linn:octopresstal$rakegenerate##GeneratingSitewithJekyllidenticals

  3. ruby - Octopress 错误 - rake 预览、观察或生成 - 2

    我遵循了OctopressDocumentation中的所有说明:sddhrthrt@thinkpad:~/octopress$rakegenerate##GeneratingSitewithJekylldirectorysource/stylesheets/createsource/stylesheets/screen.cssConfigurationfrom/home/sddhrthrt/octopress/_config.yml/home/sddhrthrt/octopress/plugins/pygments_code.rb:5:warning:alreadyinitializ

  4. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  5. ruby-on-rails - Rails 4.1 Mailer 预览和设计自定义电子邮件 - 2

    我有一个全新的Rails4.1.1应用程序,我正在其中自定义Devise电子邮件。我想让它们显示在新的Rails电子邮件预览功能中,所以我执行了以下操作:1)将以下片段添加到我的config/development.rb文件中:config.action_mailer.preview_path="#{Rails.root}/lib/mailer_previews"2)在app/mailers/user_mailer.rb中创建我的自定义Devise电子邮件UserMailer:classUserMailer3)更改了config/initializers/devise.rb以包含以下片

  6. javascript - 将 WMD 编辑器的预览 HTML 与服务器端 HTML 验证对齐(例如,没有嵌入的 JavaScript 代码) - 2

    关于如何对WMD编辑器生成的Markdown进行服务器端清理以确保生成的HTML不包含恶意脚本,如下所示:但我也没有找到堵住客户端漏洞的好方法。当然,客户端验证不能替代服务器上的清理验证,因为任何人都可以假装是客户端并向您发送令人讨厌的Markdown。而且,如果您在服务器上删除HTML,攻击者将无法保存错误的HTML,这样其他人以后就无法看到它,并且他们的cookie被盗或session被错误的脚本劫持。因此,有一个有效的案例表明,在WMD预览Pane中执行无脚本规则可能也不值得。但想象一下,攻击者找到了一种将恶意Markdown放到服务器上的方法(例如,来自另一个站点的受损提要,或

  7. javascript - GWT - ListBox,如何预览 changeEvent - 2

    我正在努力实现一个ListBox,我希望能够在用户在ListBox中进行选择时提醒他们。有没有办法响应用户单击列表框中的项目,并在“changeEvent”发生之前响应选择,这样我就可以防止changeEvent被触发。我试过使用Event.addNativePreviewHandler(newNativePreviewHandler(){@OverridepublicvoidonPreviewNativeEvent(NativePreviewEventevent){System.out.println("EVENT:"+event.getTypeInt());}});但这从不响应单击

  8. javascript - 如何在 jquery/javascript 中跳过浏览器默认打印预览​​并将内容直接打印到打印机? - 2

    因为,我们知道在C#windows窗体应用程序中,我们可以直接打印内容进行打印,而无需任何预览。当用户单击按钮时,我想在jQuery/JavaScript中打印内容,浏览器不显示任何打印预览和打印到打印机的内容。我也遇到了同样的问题。 最佳答案 经过数小时的研究,我找到了以下解决方案来解决我的问题。或许您可以使用GoogleCloundPrint设置您的打印机,然后使用云打印API以静默方式向它们提交作业。看起来您可以在提交作业时指定打印机ID。您可能需要使用html2canvas之类的工具来栅格化网页。在这里找到Selectapr

  9. javascript - jQuery 图像预览 exif 旋转问题 - 2

    我正在使用这个jQuery函数在上传之前显示图像。图片是从移动设备上传的,exif方向有问题。该函数只是将预览图片的src换成实际文件图片的base64编码。在服务器端(php),我正在使用一个函数来更正上传时的exif旋转。我可以在jQuery中制作与我的PHP代码类似的东西吗?这样我就可以在上传之前以正确的旋转显示图像?JavascriptfunctionreadURL(input){if(input.files&&input.files[0]){varreader=newFileReader();reader.onload=function(e){$('#blah').attr(

  10. javascript - 谷歌浏览器打印预览第一次不加载页面 - 2

    我正在尝试使用此代码打印页面functionPopup(){varmywindow=window.open('','Ticketinfo','height=400,width=600');mywindow.document.write('mydiv');mywindow.document.write('*{margin:0;padding:0;}body{padding:3px;padding-left:20px;font:6pxboldArial;}');mywindow.document.write('');mywindow.document.write('');mywindow.

随机推荐