使用冲突的提供程序重新安装调试应用程序

时间:2015-07-23 15:21:01

标签: android android-studio android-manifest android-contentprovider

尝试直接从Android Studio测试我的应用时遇到问题。我有一个在其清单中实现提供程序的应用程序,但是每当我从AS运行我的设备上的应用程序时,我都会收到以下错误。

Android Studio Error

这很好,我理解错误,我不介意每次重新测试之前卸载应用程序。我遇到的问题是,即使我卸载应用程序(手动或通过对话框选项),我尝试重新运行应用程序仍然会出现相同的对话框,我无法安装它。

唯一的解决办法似乎是卸载应用程序并重启设备,这显然是一个烦人的过程。如果有人遇到这个问题并且解决了这个问题,而不必每次都重新启动手机或者每次我都非常感激地改变权限。

感谢。

更新

我的清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.app.testing">

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>                
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name=".MyApplication"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".SplashActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    ...
    <service
        android:name=".services.SyncContacts"
        android:exported="true"
        android:process=":sync">
        <intent-filter>
            <action android:name="android.content.SyncAdapter"/>
        </intent-filter>
        <meta-data android:name="android.content.SyncAdapter"
            android:resource="@xml/sync_server_info" />
    </service>

    <provider
        android:name=".providers.Contacts"
        android:label="Contacts Provider"
        android:authorities="@string/appAuthority"
        android:exported="true"
        android:syncable="true"/>

    <meta-data android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
</application>

我的同步资源文件如下:

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

1 个答案:

答案 0 :(得分:0)

我遇到了有关同步适配器以及在应用的发布版本和调试版本之间进行更改的相关问题。我不确定这是否能为您提供有关您问题的任何线索,但我认为将其发布在此处并不会有什么坏处。

与您的清单一样,我也在':sync'过程中运行了同步适配器,但仅在发布时。

对于调试版本,我有一个gradle的片段,如下所示:

applicationVariants.all { variant ->
    if (buildType == "debug") {
        variant.resValue "string", "sync_process", variant.applicationId
    }
}

...然后在清单中使用字符串资源。这将确保在调试版本中,同步适配器将在主线程上运行并且很容易断点。

问题的另一部分是我在发布和调试上使用相同的内容提供程序,但有两个不同的applicationIds。

当我尝试在我自己的设备上安装发布版本来测试':sync'进程时,我会收到冲突的提供程序消息。以任何方式卸载应用程序似乎并没有完全删除它,也没有进一步重新启动,但它没有显示在设置中。所以我最终强迫调试使用':sync'进程。

最后,我通过在主线程上运行的所有进程(即上面的代码段已启用)再次构建调试来解决问题。然后我更改了提供程序以明确地使用另一个名称。然后我在Android Studio中运行了构建。

此后内容提供商已更改。我现在使调试和发布之间的应用程序ID保持一致,导致内容提供者/应用程序ID冲突不成问题。

我和我的问题之间的关系似乎是在不同的进程(特别是同步适配器)上有部分应用程序,然后尝试卸载构建。看来Android OS在删除后会保留一些此类构建应用程序的状态。