使用 Gradle 中的构建类型在一台设备上运行使用 ContentProvider 的同一应用程序

2023-12-15

我已经设置 Gradle 将包名称后缀添加到我的调试应用程序中,这样我就可以在一部手机上拥有我正在使用的发布版本和调试版本。我引用的是这个:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types

我的 build.gradle 文件如下所示:

...
android
{
    ...
    buildTypes
    {
        debug
        {
            packageNameSuffix ".debug"
            versionNameSuffix " debug"
        }
    }
}

一切正常,直到我开始在我的应用程序中使用 ContentProvider。我得到:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]

我知道发生这种情况是因为两个应用程序(发布和调试)正在注册相同的 ContentProvider 权限。

我看到了解决这个问题的一种可能性。如果我理解正确,您应该能够指定构建时使用的不同文件。然后我应该能够将不同的权限放在不同的资源文件中(并从清单中将权限设置为字符串资源)并告诉 Gradle 使用不同的资源进行调试构建。那可能吗?如果是的话,那么任何关于如何实现这一目标的提示都会很棒!

或者也许可以使用 Gradle 直接修改 Manifest?关于如何在一台设备上使用 ContentProvider 运行同一应用程序的任何其他解决方案始终受到欢迎。


现有的答案都没有令我满意,但 Liberty 已经很接近了。这就是我正在做的事情。 首先,目前我正在合作:

  • Android Studio 测试版 0.8.2
  • Gradle 插件 0.12.+
  • 等级 1.12

My goal是运行Debug版本以及Release在同一设备上使用相同的版本ContentProvider.


In 构建.gradle您的应用程序设置后缀用于调试构建:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

In AndroidManifest.xml文件集android:authorities你的财产ContentProvider:

<provider
    android:name="com.example.app.YourProvider"
    android:authorities="${applicationId}.provider"
    android:enabled="true"
    android:exported="false" >
</provider>

In your code set AUTHORITY可以在实现中任何需要的地方使用的属性:

public static final String AUTHORITY = BuildConfig.APPLICATION_ID + ".provider";

Tip:之前是BuildConfig.PACKAGE_NAME

就是这样!它会像魅力一样发挥作用。如果您使用 SyncAdapter,请继续阅读!


SyncAdapter 更新 (2014 年 11 月 14 日)

我将再次从当前的设置开始:

  • Android Studio 测试版 0.9.2
  • Gradle 插件 0.14.1
  • 摇篮2.1

基本上,如果您需要为不同的构建自定义一些值,您可以从 build.gradle 文件中完成:

  • use 构建配置字段从访问它BuildConfig.java class
  • use resValue从资源中访问它,例如@字符串/你的值

作为资源的替代方案,您可以创建单独的 buildType 或风味目录并覆盖其中的 XML 或值。但是,我不会在下面的示例中使用它。

Example


In 构建.gradle文件添加以下内容:

defaultConfig {
    resValue "string", "your_authorities", applicationId + '.provider'
    resValue "string", "account_type", "your.syncadapter.type"
    buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type"'
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        resValue "string", "your_authorities", defaultConfig.applicationId + '.debug.provider'
        resValue "string", "account_type", "your.syncadapter.type.debug"
        buildConfigField "String", "ACCOUNT_TYPE", '"your.syncadapter.type.debug"'
    }
}

您将看到结果构建配置.java class

public static final String ACCOUNT_TYPE = "your.syncadapter.type.debug";

and in 构建/生成/res/生成/调试/值/生成.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Automatically generated file. DO NOT MODIFY -->
    <!-- Values from default config. -->
    <item name="account_type" type="string">your.syncadapter.type.debug</item>
    <item name="authorities" type="string">com.example.app.provider</item>

</resources>

In your 验证器.xml使用 build.gradle 文件中指定的资源

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                       android:accountType="@string/account_type"
                       android:icon="@drawable/ic_launcher"
                       android:smallIcon="@drawable/ic_launcher"
                       android:label="@string/app_name"
/>

In your 同步适配器.xml再次使用相同的资源并且@字符串/权威机构 too

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
              android:contentAuthority="@string/authorities"
              android:accountType="@string/account_type"
              android:userVisible="true"
              android:supportsUploading="false"
              android:allowParallelSyncs="false"
              android:isAlwaysSyncable="true"
        />

Tip:自动完成(Ctrl+空格)不适用于这些生成的资源,因此您必须手动输入它们

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

使用 Gradle 中的构建类型在一台设备上运行使用 ContentProvider 的同一应用程序 的相关文章

  • Android从VideoView获取视频源路径

    我有 VideoView 实例 我需要知道它的视频源路径 是否可以 有谁能够帮助我 我的 WebChromeClient 类代码是 Override public void onShowCustomView final View view
  • 如何从 JSON 响应中获取所选微调项目的 ID?

    Outline 我必须从服务器获取一些运营商列表 下面是我的 JSON 数据 PrepaidServiceList operator id 2 operator name Reliance GSM operator id 9 operato
  • 一部又一部的Android动画

    我在 TextView 上有两个 TranslateAnimations 我希望它们一个接一个地执行 但是 通过使用下面的代码 仅执行第二个代码 我该如何解决这个问题 TranslateAnimation animation new Tra
  • 如何在Android中访问Sqlite数据库?

    我可以在模拟器中使用 adb shell 命令访问我的 sqlite 数据库 但无法对我的 HTC Desire 手机执行相同操作 它会抛出一些权限被拒绝的消息 是否有可能访问这些数据库以进行调试 任何想法 提前致谢 您还可以在命令提示符
  • MPAndroidChart - 饼图的所有部分都是相同的颜色

    我正在使用 MPAndroidChart https github com PhilJay MPAndroidChart https github com PhilJay MPAndroidChart 库来生成饼图 我遵循了多个教程 包括
  • 无法绑定到调试器的本地 XXXX

    我不断得到Can t bind to local XXXX for debugger控制台中的消息 但不适用于 1 个端口 适用于所有随机端口 我已经完成了中所述的操作这个问题 https stackoverflow com questio
  • ALBUM_ART列从API 29等开始被弃用,如何获取路径?

    我们目前正在使用以下方式获取专辑封面的路径 MediaStore Audio AlbumColumns ALBUM ART 并且正在成功获取路径 但 Pixel 3a Android 10 除外 经过一番研究 API 29 及以上版本已弃用
  • 如何在 Google Maps API V2 中获取我的当前位置

    我正在创建一个应用程序 用户需要使用 getMyLocation 查看他 她的地理位置 但这返回 null 有没有解决这个问题的方法 因为我确实读到 getMyLocation 方法总是返回 null 我是 Google 地图新手 因此我们
  • 我的应用程序中的 google+ 集成

    我是 Android 开发新手 正在创建一个带有 Google 集成的 Android 应用程序 我看到了一个教程并开始遵循它 但自教程以来 Google 已经更新了 Google 集成 例如 在本教程中您曾经单击 获取配置文件 按钮htt
  • 在 Android 上以编程方式输入 *#*#4636#*#* 等密码

    在许多 Android 设备上 您可以通过键入以下内容从 电话 应用程序进入秘密设置菜单 4636 http technology headlines com 2010 09 17 4636 android secret codes htt
  • CameraX:将照片捕获为位图

    我正在尝试使用护目镜CameraX示例应用程序 CameraXBasic 可以在 Github 上找到 并且希望将图像捕获为位图 以便能够在保存图像之前对图像进行一些修改 有人对如何实现这一目标有建议吗 请参阅下面的Google原始代码来捕
  • 在 Android 中将连续动画应用到 ImageView

    我想将连续的动画 例如 ScaleAnimation 应用到显示资源图像的 ImageView 动画由按钮触发 例如 我想在每次单击按钮时逐渐放大图像 我已在动画上设置 fillAfter true 但是 所有动画都是从 ImageView
  • 无法分派 DDM 块 46454154:未定义处理程序 - Eclipse - Android SDK

    我正在 Windows 7 64 位机器上工作 刚刚下载并安装了 Android SDK 并且正在使用带有 Android 插件的 Eclipse 我刚刚浏览了 Hello Android 指南 你好 安卓 http developer a
  • 将mapView缩放到osmdroid上的某个边界框

    我想使用 ZoomToBoundingBox 方法将地图缩放到特定的边界框 该方法除了以缩放级别 0 显示地图外什么也不做 在mapView java源代码中我发现了这个 缩放地图以尽可能靠近地包围指定的边界框 必须在显示布局完成后调用 否
  • 无法按宽度包装任意行数的类似块引用的 TextView

    I need to render a quote block of arbitrary length The text must be aligned to the left while the block itself aligned t
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • 如何在 Android (Xamarin) 中以编程方式从当前主题获取颜色

    我需要以编程方式获取一些默认主题颜色值 例如 windowBackground colorPrimary 我正在执行活动中的代码 我的目标安卓API 为 21 我正在使用一个Theme Material theme 我试过了 var att
  • 在 libgdx 中截取屏幕截图

    我有一个应用程序 我想在其中截取游戏屏幕的屏幕截图并将其保存为图像并上传到 Facebook 我正在使用 Libgdx 我的重点是 android 谁能帮助我如何以编程方式截取游戏屏幕并将其另存为图像 现在相当容易 Libgdx提供了一个例
  • Android Google plus 注销按钮看起来与 Google 教程文档中的登录按钮不同

    我正在按照 Google 开发人员网站中提到的步骤在我的应用程序中实现登录和注销 如前所述 添加登录和退出按钮的代码是
  • 如何在 Android 键盘中包含建议

    我正在开发 Android 软键盘 我已经创建了键盘布局 但不知道如何包含在 EditText 中键入一些单词时出现的建议 例如 如果我写 在 中 已知 和 已知 将显示在建议中 所以我的问题是 1 如何在 Android 软键盘中包含建议

随机推荐

  • 在现有第一个表单中使用弹出表单中的功能

    我无法弄清楚如何正确执行此操作 基础知识是我有 1 个表格 用于填写我保存在 2 个列表中的各种数据 第二种形式是通过菜单选项调用的 该菜单选项显示所有当前数据的概述 它是这样打开的 private void OpenOverviewFor
  • Div 内未知大小文本的底部填充

    Here I want to have a text padding margin on the bottom part of my Div to have a more organized and tidier look 我希望它能够灵活
  • 如何格式化文本字段javafx

    我希望能够以 hh mm ss 格式在 javafx 文本字段中输入时间 我将如何格式化文本字段 我已经获得了正则表达式方法 因此它只接受数字作为输入 public void format TextField t String regex
  • 为什么使用 == 比较两个整数有时有效有时无效? [复制]

    这个问题在这里已经有答案了 我知道我在使用 时比较参考 这不是一个好主意 但我不明白为什么会发生这种情况 Integer a 100 Integer b 100 Integer c 500 Integer d 500 System out
  • 在 Android 中使用 OpenCV 从 CameraFrame 检测 RGB 值

    我想检测 RGB 中哪个值最大 我怎样才能检测到这一点 我想显示哪种颜色出现频率最高 RGB 值 例如 在图像中 红色出现率最高 因此它将显示颜色为红色 并以百分比形式显示其值 我通过获取图像的行和列进行了尝试 如下所示 public Ma
  • 获取 wifi 信号强度

    有没有办法在C 中获取wifi信号强度 目前我也得到了同样的结果 Process proc new Process proc StartInfo CreateNoWindow true proc StartInfo FileName net
  • 为什么我的方法会陷入无限递归?

    我编写了一种方法来帮助构建四叉树 每个四叉树都有一个根节点 一个根节点有4个子节点 我使用深度递归来阻止该函数划分太多次 传入的深度等于正方形边长以 2 为底的对数 始终传入正方形 然而 我从中得到了无限递归 有人明白为什么吗 当我运行它时
  • 根据查询结果设置用户变量

    是否可以根据 MySQL 中的查询结果设置用户变量 我想要实现的是这样的 我们可以假设两者USER and GROUP是独一无二的 set user 123456 set group select GROUP from USER where
  • 如何动态改变背景颜色的资源?

    我有以下控制 我想更改某些事件触发器的背景颜色 我想做这个clrGray资源作为某些事件点击的颜色 我已经尝试过以下方法 但没有成功 XAM
  • 单击项目 RecyclerView 时不显示 toast

    好吧 我知道 可能已经有人问过这个问题了 我已经为我的问题找到了可能的解决方案这个链接 但是 由于未知的原因 该解决方案对我不起作用 我想显示一个Toast当一个项目 aCardView 在 a 内单击RecyclerView This T
  • 如何实现 Functor[数据集]

    我正在努力研究如何创建一个实例Functor Dataset 问题是当你map from A to B the Encoder B 必须在隐式范围内 但我不知道该怎么做 implicit val datasetFunctor Functor
  • 使用 php 从通过 ajax 发送的 dataURI 生成 png 文件

    我有一个 svg 文件 它生成 dataURI png 并且效果很好 我希望将该 dataURI 保存为图像 因此我尝试通过 ajax 将 dataURI 发送到另一个可以执行 PHP 的服务器 但我无法让它发挥作用 这是生成 dataUR
  • Xamarin Form - 如何在 UWP 中存储 PDF 或 JPEG 格式的图像

    大家好 我正在开发 DMS 应用程序 用户可以通过扫描仪扫描文档或图像并上传到服务器 为了扫描目的 我参考了这个link它工作完美 现在的问题是 ImageScanner ScanFilesToFolderAsync ImageScanne
  • 格式化和显示
    时出现问题

    我对编码还很陌生 所以请耐心等待 我已经读到不同的浏览器以不同的方式显示水平规则 我似乎无法在 Firefox 或 Chrome 中得到正确的结果 到目前为止我只检查过两个 这是我的 hr 在 Firefox 中的样子 http posti
  • CSS 获取没有类的最后一个孩子

    这对你们来说是一个棘手的挑战 CSS 选择器要获取 last child那个没有类 到目前为止我已经尝试过 nav item not nav item mobile last child nav item last child not na
  • 当前 = 当前 * 10 + (c - '0');

    我试图通过这段代码读取未知数量的整数 while 1 int c getchar if c EOF break else if isdigit c current current 10 c 0 else total current curr
  • 压缩而不创建父文件夹

    我有一个这样的文件夹结构 project folder 01 file1 cpp file2 cpp folder 02 file1 cpp file2 cpp 我想以我得到的方式 当我解压时 压缩项目文件夹的内容 folder 01 fi
  • Java 中的 switch case 逻辑表达式语句 - 与 JS 或 PHP

    在 JavaScript 中 我也在 PHP 中看到过 您可以在案例中使用逻辑表达式 例如 switch true case d lt 10 document write Less than 10 break case d 10 docum
  • C# 模块预计包含程序集清单

    大家好 我是 C 世界的新手 我必须使用它 因为依赖于来自多播源的 xceedzip dll 压缩数据 在编写了一些用于接收提要的代码后 我在调用此 dll 时遇到了障碍 据我了解 我需要使用 System Reflection 并调用 d
  • 使用 Gradle 中的构建类型在一台设备上运行使用 ContentProvider 的同一应用程序

    我已经设置 Gradle 将包名称后缀添加到我的调试应用程序中 这样我就可以在一部手机上拥有我正在使用的发布版本和调试版本 我引用的是这个 http tools android com tech docs new build system