重构后更改内容提供程序包

时间:2013-04-23 01:42:59

标签: java android refactoring

我从去年的Google IO分叉了IOSchedule应用程序。我想确保我能获得一个API密钥,这意味着我需要签署该应用程序,它与内容提供商没有冲突,这意味着我需要重构。但是,每次我尝试使用Android工具>重构包名称,我遇到问题,即修改内容提供商。

这是内容提供商的标签:

<provider
android:name="com.google.android.apps.iosched.provider.ScheduleProvider"
android:authorities="com.google.android.apps.iosched"
android:label="@string/app_name"
android:syncable="true"
android:writePermission="com.google.android.apps.iosched.permission.WRITE_SCHEDULE" />

我一直在尝试将其更改为以下内容:

<provider
android:name="com.google.android.apps.iosched.provider.ScheduleProvider"
android:authorities="org.mrkaiser.android.apps.iosched"
android:label="@string/app_name"
android:syncable="true"
android:writePermission="com.google.android.apps.iosched.permission.WRITE_SCHEDULE" />

但是在运行时我收到以下错误:

04-22 21:29:13.818: E/AndroidRuntime(12329): java.lang.NullPointerException 04-22 21:29:13.818: E/AndroidRuntime(12329): at com.google.android.apps.iosched.ui.MyScheduleFragment.onLoadFinished(MyScheduleFragment.java:175) 04-22 21:29:13.818: E/AndroidRuntime(12329): at com.google.android.apps.iosched.ui.MyScheduleFragment.onLoadFinished(MyScheduleFragment.java:1) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:424) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:392) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.Loader.deliverResult(Loader.java:103) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.os.Handler.dispatchMessage(Handler.java:99) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.os.Looper.loop(Looper.java:137) 04-22 21:29:13.818: E/AndroidRuntime(12329): at android.app.ActivityThread.main(ActivityThread.java:5226) 04-22 21:29:13.818: E/AndroidRuntime(12329): at java.lang.reflect.Method.invokeNative(Native Method) 04-22 21:29:13.818: E/AndroidRuntime(12329): at java.lang.reflect.Method.invoke(Method.java:511) 04-22 21:29:13.818: E/AndroidRuntime(12329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 04-22 21:29:13.818: E/AndroidRuntime(12329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 04-22 21:29:13.818: E/AndroidRuntime(12329): at dalvik.system.NativeStart.main(Native Method)

我不确定我做错了什么。如果我尝试重构包R与一些xml文件不同步,我无法恢复。

2 个答案:

答案 0 :(得分:1)

所以我真的想通了。项目中的ScheduleContract声明了内容权限。如果没有指向正确的包,它将无法找到它。

答案 1 :(得分:0)

我认为您还必须重命名您的提供程序....如果您正在使用eclipse尝试通过它重命名您的程序包。尝试重命名它:

android:name="org.mrkaiser.android.apps.iosched.provider.ScheduleProvider"
android:authorities="org.mrkaiser.android.apps.iosched"
android:label="@string/app_name"
android:syncable="true"
android:writePermission="org.mrkaiser.android.apps.iosched.permission.WRITE_SCHEDULE"

并通过eclipse重命名您的包名。它将更新所有引用。还要更改androidmanifest.xml中的包名称