在 Android Oreo 中调用相机意图后正在重新创建父 Activity

2024-01-27

我正在使用媒体意图捕获图像。一旦过程完成,结果将被发送回父级。 上述过程在 Nougat Os 上正常工作,但在 Oreo 中,父活动再次重新创建。我该如何解决这个问题。


上述过程在 Nougat Os 上正常工作,但在 Oreo 中,父活动再次重新创建

当相机应用程序位于前台时,您的进程将被终止。这是完全正常的,与 Android 8.0 无关。它与可用的系统 RAM 以及当时设备中发生的所有情况有关。

我该如何解决这个问题。

没有问题。当您没有前台 UI 时,您的进程可以随时终止。你的代码需要处理这个问题。

例如,如果您正在使用EXTRA_OUTPUT在你的ACTION_IMAGE_CAPTURE Intent,您需要记住该值,因为您不会从相机应用程序以任何形式的结果返回它。将其保存为已保存实例状态Bundle是一个典型的解决方案,正如我在这个示例应用程序 https://github.com/commonsguy/cw-omnibus/tree/v8.7/Camera/FileProvider,特别是在这个活动中:

/***
 Copyright (c) 2008-2017 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain a copy
 of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 Covered in detail in the book _The Busy Coder's Guide to Android Development_
 https://commonsware.com/Android
 */

package com.commonsware.android.camcon;

import android.Manifest;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.widget.Toast;
import java.io.File;
import java.util.List;

public class MainActivity extends Activity {
  private static final String EXTRA_FILENAME=
    "com.commonsware.android.camcon.EXTRA_FILENAME";
  private static final String FILENAME="CameraContentDemo.jpeg";
  private static final int CONTENT_REQUEST=1337;
  private static final String AUTHORITY=
    BuildConfig.APPLICATION_ID+".provider";
  private static final String PHOTOS="photos";
  private File output=null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState==null) {
      output=new File(new File(getFilesDir(), PHOTOS), FILENAME);

      if (output.exists()) {
        output.delete();
      }
      else {
        output.getParentFile().mkdirs();
      }

      Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output);

      i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);

      if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
      }
      else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) {
        ClipData clip=
          ClipData.newUri(getContentResolver(), "A photo", outputUri);

        i.setClipData(clip);
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
      }
      else {
        List<ResolveInfo> resInfoList=
          getPackageManager()
            .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);

        for (ResolveInfo resolveInfo : resInfoList) {
          String packageName = resolveInfo.activityInfo.packageName;
          grantUriPermission(packageName, outputUri,
            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
      }

      try {
        startActivityForResult(i, CONTENT_REQUEST);
      }
      catch (ActivityNotFoundException e) {
        Toast.makeText(this, R.string.msg_no_camera, Toast.LENGTH_LONG).show();
        finish();
      }
    }
    else {
      output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME);
    }
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putSerializable(EXTRA_FILENAME, output);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode,
                                  Intent data) {
    if (requestCode == CONTENT_REQUEST) {
      if (resultCode == RESULT_OK) {
        Intent i=new Intent(Intent.ACTION_VIEW);
        Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output);

        i.setDataAndType(outputUri, "image/jpeg");
        i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        try {
          startActivity(i);
        }
        catch (ActivityNotFoundException e) {
          Toast.makeText(this, R.string.msg_no_viewer, Toast.LENGTH_LONG).show();
        }

        finish();
      }
    }
  }
}

在这里,我紧紧抓住output保存的实例状态中的位置Bundle,所以即使我的进程被终止,我也会得到我的output back.

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

在 Android Oreo 中调用相机意图后正在重新创建父 Activity 的相关文章

  • 如何检测 Android 设备中的新应用

    我想检测用户何时安装或删除应用程序 但没有找到BroadcastReceiver就是这样做的 在我的应用程序中 我获取了有关该类已安装应用程序的信息PackageManager 但我不想定期扫描应用程序 有没有BroadcastReceiv
  • 在flutter中跟踪背景位置时使用background_locator插件时出现问题

    我正在尝试使用 flutter 跟踪后台位置 为此我正在使用背景定位器 https pub dev packages background locator插入 它的实现方式是注册某些静态回调函数 我声明了一个 File 类型的类变量来在后台
  • 自动调整文本视图大小不起作用

    您好 我在我的 Android 应用程序中使用自动调整大小文本视图 我的应用程序 minSdkVersion 是 19 所以我正在使用支持库 https developer android com guide topics ui look
  • 在Graphview android的LineGraphSeries中的两个系列之间填充颜色

    I have created a line graph using GraphView demo But I need to fill the areas only between the lines with a specific col
  • 如何使用 Java 代码在 Android 中显示图像

    我尝试使用 java 代码而不是 xml 在 android 中显示图像 我已经使用 xml 文件完成了它 但我的要求是使用 java代码以获得更多功能 预先感谢您的帮助 如果你想从drawable文件夹加载图像 你可以使用 ImageVi
  • if-else 无法与我的复选框一起正常工作

    我的应用程序中有一个网格 当我选择一个项目时 它会前瞻性地加载该项目 我只想允许仅在以下情况下选择该复选框isMayoBaseAvailable返回真 这是我使用的代码 当我使用此代码并调试它时它工作正常 但是当我运行应用程序并检查它时总是
  • Android - 尝试重新打开已关闭的对象:使用 loaderManager 的 SQLiteQuery

    我对 android 相当陌生 我对过滤后的 listView 和它从横向模式更改为纵向模式的活动有一些问题 反之亦然 我有一个用于过滤 drinkSearch 的 editText 只要我不更改视角 纵向与横向 此过滤就有效 这是我得到的
  • Kotlin自定义get执行方法调用

    为了提高对 SharedPreferences Editor 调用的可读性 我想使用一个 Kotlin 变量 每次需要新的 SharedPreferences Editor 时都会执行 getSharedPreferences edit 最
  • 如何获取与 TextView 关联的字符串资源的 id?

    我可以访问 TextView 实例 获取它的资源 ID 并通过以下方式获取它的资源名称getResources getResourceEntryName 但我似乎找不到一种方法来获取与其关联的字符串的 id 如何动态获取与 TextView
  • Android - 如何使用操作创建通知[重复]

    这个问题在这里已经有答案了 我正在创建这样的通知 Notification Builder builder new Notification Builder context builder setContentTitle notifyMes
  • 两个具有相同 id 的视图

    安卓如何使用R id id name膨胀 XML 后查找视图 1 假设我有两个 XML 每个按钮都有相同的 id 2 我对它们进行了膨胀并将它们转换为视图 3 R id类中只有一个int将为这两个按钮创建 android 如何区分这些具有相
  • 将项目导入 Eclipse 后出现“必须重写超类方法”错误

    任何时候我必须将我的项目重新导入到 Eclipse 中 如果我重新安装了 Eclipse 或者更改了项目的位置 几乎全部我的重写方法的格式不正确 导致错误 该方法必须重写超类方法 值得注意的是 无论出于何种原因 Android 项目中方法参
  • 当键盘出现时滚动布局

    当键盘出现并隐藏工具栏 FrameLayout 时 我的屏幕大小调整到顶部 我只需将聊天项目滚动到顶部并将框架布局保持在顶部 我尝试了谷歌和SO的一些例子 但对我没有任何帮助
  • 如何构建 APK 和应用程序动态加载的单独库

    简短的总结是 如何构建 APK 和单独的库 我指的是某种形式的类集 理想情况下也是资源 例如 JAR AAR 或 DEX 文件 但不将这些库包含在应用程序 相反 应用程序在运行时加载它们 Detail 所以我的主要问题是如何构建这样的应用程
  • 旋转器扩展到屏幕边界之外

    我有一个布局 其中包含一个三行的 TableLayout 每行都有一个 TextView 和一个 Spinner Spinners 的柱子设置为拉伸 我的问题是 当旋转器包含长字符串时 旋转器会超出屏幕边缘 我希望他们截断字符串 这是问题的
  • 多次调用 startService 时实际会发生什么

    我正在打电话startService 多次对同一服务有不同的意图 很明显 任何时候都只存在一个服务实例startCommand 被称为每个startService 我的问题是 调用时有性能影响吗startService 多次 意图会按照调用
  • 在 Android 模拟器中更改屏幕亮度

    Android模拟器可以测试屏幕亮度变化吗 我尝试过各种示例 它们都使用以下代码片段 WindowManager LayoutParams lp window getAttributes lp screenBrightness some f
  • 如何将 onClick 侦听器附加到应用程序小部件上的列表视图项

    我喜欢向列表视图的每个项目添加一个 onClick 侦听器 但我尝试过的方法都不起作用 这是我的 RemoteViewsFactory public class MyRemoteViewsFactory implements RemoteV
  • 如何在 EditText 中用逗号分隔数字

    我有一个 EditText 其 inputType 为number 当用户打字时 我想用逗号分隔数字 这是一个小例子 123 将表示为 123 1234 将表示为 1 234 12345 将表示为 12 345 等等 我尝试使用 TextW
  • sqlite3权限被拒绝android

    我试图直接在 Nexus 上访问我正在开发的应用程序的数据库 但当我尝试执行 sqlite3 命令时 我收到 权限被拒绝 的消息 我还尝试在 root mod 中启动 adb 但再次 设备上的权限被拒绝 我想我必须使用模拟器来做到这一点 但

随机推荐

  • 如何检查我的 AVPlayer 是否正在缓冲?

    我想检测我的 AVPlayer 是否正在缓冲当前位置 以便我可以显示加载程序或其他内容 但我似乎在 AVPlayer 的文档中找不到任何内容 你可以观察你的价值观player currentItem playerItem addObserv
  • Magento 中 /app/code/core/Mage/Core/Model/Resource/Resource.php 出现致命错误

    刚刚将 Magento 安装从 1 5 升级到 1 6 并出现以下错误 致命错误 在非对象上调用成员函数 insert hsphere local home t21004 XXXXXXXXXXXXX com app code core Ma
  • 需要 C# 程序集来松散引用强命名程序集

    所以问题就在这里 我正在编写一些 StyleCop 插件程序集 供我工作的公司使用 因此 这些程序集需要引用强命名的 Microsoft StyleCop CSharp dll 问题在于 如果我构建这个并将其传递给我组中的开发人员 他们必须
  • 使用内置 Hive 运行 Spark 并为 Hive Metastore 配置远程 PostgreSQL 数据库

    我正在运行带有内置 Hive 的 Spark v1 0 1 使用 SPARK HIVE true sbt sbt 程序集 程序集安装 Spark 我还配置 Hive 将 Metastore 存储在 PostgreSQL 数据库中 如下所示
  • Conda 包冲突,Geopandas

    在通过 conda forge 命令在终端中失败后 尝试在我的环境中安装 geopandas 时 我收到以下错误 有没有办法更新和修复这个问题 Output in format Requested package gt Available
  • 使用 matlab 求解 ode 系统

    我有 9 个带有时间相关系数的方程g MY M file function dy tarak t y G 3 16 g 0 1 exp t 200 90 2 dy zeros 9 1 dy 1 2 2 y 1 2 G y 5 2 g y 7
  • 强制 PostgreSQL 释放分配的内存

    我的 Postgres 在负载下达到了最大允许内存 500MB 并运行 14 个进程 一旦加载结束 Postgres 仍然保留分配的内存并运行 14 个进程 由于我有 Apache 和 Tomcat 在同一台机器上运行 我想 Postgre
  • 我可以通过请求向 Firestore 规则发送值吗

    我必须发送带有请求的值 以便从 Firestore 规则中检查它 例如 Recaptcha 以避免垃圾邮件 或来源 保护我自己的 firebase api 有什么办法可以做到这一点吗 无法将自定义参数传递到 Firestore 规则中 最常
  • Xcode 5 未检测到运行 iOS 8 的 iPhone

    我有一部安装了 iOS 8 的 iPhone 但是当我将其连接到 Xcode 5 1 时 它无法识别 与其他答案一样 我的 iOS 8 设备是否被 Xcode 5 1 识别似乎是相当随机的 如果您插入了 iOS 8 设备 它似乎可以工作be
  • 如何通过 3D 点云拟合一条线?

    我有一根电缆从移动的车辆上掉落到地面上 我使用摄像头系统实时估计绳索接触地面的位置 车辆的移动和位置估计的不准确会导致着陆位置的点云 从这个点云中 我想获得电缆在地面上最有可能的路径 我希望实时实现这一目标 并且希望根据新数据更新拟合 添加
  • OSGI 容器中的 Scala?

    如何在 Scala 中编码我的包 然后将其部署到 OSGI 容器中 我是否首先将其编译为 java 或者我可以将scala直接部署到OSGI中并使用某种捆绑包来识别它 任何指点都会很棒 目前 我使用 Apache Felix 作为我的 os
  • 学说 2 文档示例中的正方和反方是什么

    在关联映射的这个页面上 manytomany 部分有一个示例 但我不明白哪个实体 组或用户 是拥有方 http docs doctrine project org en 2 0 x reference association mapping
  • 如何在列表框右键单击上创建上下文菜单?

    我有一个带有列表框的窗口 我想右键单击列表框中的条目并在上下文菜单中显示某些选项 我在网上查看过 但似乎我只能获得 MFC C 或简单的 c 中的示例 这在标准 Win32 C 中可能吗 我可以通过 WM CONTEXTMENU 消息处理列
  • 自定义枚举类的显示

    我想使用自定义枚举类的显示matlab mixin CustomDisplay 如果我有一个常规 非枚举 类 如下所示 classdef test lt handle matlab mixin CustomDisplay propertie
  • 如何使用 memcpy_toio/fromio?

    我正在用 C 语言开发一个内核模块来与 PCIe 卡通信 并且我使用 pci iomap 分配了一些 io 内存 并使用 ioread write32 在那里写入 读取 这可行 但性能很差 我读到我可以通过 memcpy toio from
  • “aspnet_regiis -i”在生产服务器上有多安全?

    我有一个生产 IIS 服务器 它托管许多 Web 应用程序 其中大多数都相对简单 服务器上已安装 NET Framework 版本 4 5 但 IIS 尚未配置为使用它 我想在新应用程序上使用 4 5 这个 Stackoverflow 帖子
  • 打印应用了 CSS 样式的 Angular 网页

    我见过很多帖子询问如何使用 CSS 样式打印网页 但没有一个解决方案对我有用 网页如下所示 Webpage https i stack imgur com FSBKm png 我需要它来打印所有颜色编码 但是当我去打印它时 我遇到了这个混乱
  • 前 5 行按每个类型的引用求和,所有其他行等于 1,按团队 ID 分组

    我有一个 SQL 语句 其中每个 TYPE 的前 5 行是根据 WSF REF 选择的 其中 STATUS Approved 的 WEIGHTS 相加 每个类型的每个引用的所有其他行都被归类为 1 这工作正常 我正在寻找添加第二组 TEAM
  • 如何消除 UIAlertController 的延迟?

    点击表格单元格后 警报视图显示有 4 到 5 秒的延迟 下面是代码 func tableView tableView UITableView didSelectRowAt indexPath IndexPath let cell table
  • 在 Android Oreo 中调用相机意图后正在重新创建父 Activity

    我正在使用媒体意图捕获图像 一旦过程完成 结果将被发送回父级 上述过程在 Nougat Os 上正常工作 但在 Oreo 中 父活动再次重新创建 我该如何解决这个问题 上述过程在 Nougat Os 上正常工作 但在 Oreo 中 父活动再