5

当我MyContentProvider在调试模式下开发和运行时,我的应用程序运行良好。

<provider android:name=".MyContentProvider"
        android:authorities="com.contactcities"
        android:exported="false">
</provider>

但是当我导出应用程序,下载并运行它时,它会立即崩溃:

10-10 18:24:37.682 E/AndroidRuntime(10428): FATAL EXCEPTION: main
10-10 18:24:37.682 E/AndroidRuntime(10428): java.lang.RuntimeException: Unable to get provider com.contactcities.MyContentProvider: java.lang.ClassNotFoundException: com.contactcities.MyContentProvider in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.contactcities-1.apk]
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installProvider(ActivityThread.java:4509)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4281)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4237)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.access$3000(ActivityThread.java:125)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Looper.loop(Looper.java:123)

我可以在我所有的设备上重现它,2.2、4.0、4.1

我今天阅读了许多线程。他们中的一些人将此归咎于 ProGuard。我试过添加

-keep public class com.contactcities.MyContentProvider

但没有运气。

当我禁用 proguard 时,不要放入proguard.config=proguard.cfg我的project.properties. 它仍然在发布版本中给出相同的错误。调试又好了。也许它不足以禁用这样的proguard?

也许提示是它在这次崩溃中引用了 maps.jar。我不知道为什么会这样

in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar

任何线索将不胜感激

4

5 回答 5

4

啊,我以为我试过了,但似乎我没有。

Project->clean让它工作

掌心

于 2012-10-16T10:00:55.350 回答
1

我遇到了同样的错误,原来我在AndroidManifest.xmlandroid:name中的提供程序标记的属性值错误:

<provider
    android:authorities="com.example.ProviderClass"
    android:name=".ProviderClass"
    android:exported="false" >
</provider>

因此,请仔细检查此值是否如上.ProviderClass或您的类名是什么(以点为前缀)。然后执行 Project > Clean,它将起作用。

于 2014-03-10T10:17:19.487 回答
1

authority 属性需要与内容权限匹配,而 name 属性需要与您的自定义提供程序类的类名匹配。

例如:

      <provider
         android:authorities="com.richa.myapp"
         android:name=".data.CustomProvider"/>
于 2016-02-11T13:07:04.770 回答
0

也许我的经验不足会帮助其他人解决这个错误。这对我来说完全是神秘的,但就像计算机中的一切一样,一旦你知道了就很明显了。

我正在关注本教程,总体来说非常好: http ://www.vogella.com/tutorials/AndroidSQLite/article.html

早些时候,他说要创建一个名为“contentprovider”的包,然后在其中创建一个类“MyTodoContentProvider”。现在任何熟悉 Java 风格命名约定的人都会看到这应该是相对于主包的。但我对这一切都很陌生,所以我在某个地方创建了它。

通过构建代码,一切正常。Eclipse 找到并包含了这个包,并且没有显示任何错误。然后是崩溃和神秘的“无法获取提供者”消息。错误消息中的路径,我现在理解的是代码正在寻找类的不存在的路径,它太长并且包含太多的“contentprovider”迭代,很难看出它指的是什么或什么错了。

我怀疑问题出在清单文件中,但我确定它出在“android:authority”中。这有点不直观。清单中此元素中的字符串对应于您在提供程序类中公开的公共成员。该成员名为“CONTENT_URI”。但两者并不完全匹配。例如:

private static final String AUTHORITY = "com.vegnab.provider";
private static final String BASE_PATH = "todos";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);

这最终得到:

CONTENT_URI = "content://com.vegnab.provider/todos"

(请注意,AUTHORITY 本身是私有成员,不能从外部获得。)

相应的清单行将是:

android:authorities="com.vegnab.provider"

这是方案“content://”和基本路径之间的中间部分。

问题实际上出在清单行中:

android:name=".contentprovider.MyTodoContentProvider"

我在名为“contentprovider”的包中有一个名为“MyTodoContentProvider”的无错误类,那么问题是什么?问题是包裹放错了地方。它应该是相对于主包的。这就是名称中第一个点的含义。它应该遵循与活动的“android:name”行相同的语法,在它们的清单部分中。

如果您觉得这很有用,请单上。一旦你解决了这个问题,很容易忘记它是多么神秘。

于 2014-11-27T15:29:15.067 回答
0

在 Android 5.0(API 级别 21)将 DEX 运行时替换为 ART 之前,您可能已经通过了旧操作系统版本的类限制。如果您正处于极限边缘,您可以通过编译,但在启动期间会出现此错误。

尝试按照 Android Enable Multidex for Apps with Over 64K Methods文档中的说明启用 multi-dex。

于 2018-05-28T20:36:06.187 回答