6

我一直在开发一个利用 android 可比性库 (android-support-v4) 的 android 应用程序。在 SDK 20 之前,我能够使用uses-sdk清单中的以下条目来编译我的应用程序。

<uses-sdk android:minSdkVersion="7" />  

我所有为结果开始活动的片段都正确收到了结果。

一天(在我更新到 SDK 20 之前)我正在修复 lint 问题,并android:targetSdkVersion根据 lint 标志的请求添加到清单中,我很快意识到我的所有片段都没有收到它们的 onActivityResilt() 调用。

现在,自从我更新到 SDK 20.0.1 后,我不得不在清单中使用android:targetSdkVersioninuses-sdk条目;否则永远不会生成 R.java。

这是我当前的uses-sdk清单条目

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="16" />

目前由于这个奇怪的错误,我的应用程序目前仍然被破坏。我已经尝试将我的兼容库更新为最新版本 r9。

我还仔细检查了我startActivityForResult()在片段中的所有调用。他们都通过片段的方法使用正确的调用。

IE

 this.startActivityForResult(intent, requestCode);

不是

 this.getActivity().startActivityForResult(intent, requestCode);

我目前的开发环境:

Android SDK 20.0.1
Android SDK Platform Tools 13
ADT 20.0.2

任何帮助将不胜感激,因为这个错误目前是阻止我进行最终 beta 测试的砖墙。

编辑

这是我的输出ant debug

$ ant debug Buildfile: /home/ricky/Development/workspace/location_ringer/LocationRinger/build.xml

-设置模式检查:

-设置调试文件:

-check-env: [checkenv] Android SDK 工具修订版 20.0.1 [checkenv] 安装在 /app/android-sdk-linux_86

-setup:[echo] 项目名称:ListActivity [gettype] 项目类型:应用程序

-设置调试模式:

-调试混淆检查:

-build-setup: [echo] Resolving Build Target for ListActivity... [gettarget] Project Target: Google APIs [gettarget] Vendor: Google Inc. [gettarget] Platform Version: 4.1 [gettarget] API level:
16 [echo] - --------- [echo] 如果需要,创建输出目录... [echo] ---------- [echo] Resolving Dependencies for ListActivity... [dependency] 库依赖:[依赖项] [依赖项] ------------------ [依赖项] 有序库:[依赖项] [依赖项] --------------- --- [dependency] API<=15:将 annotations.jar 添加到类路径。[echo] ---------- [echo] 使用“调试”构建库...

节点:

-设置模式检查:

-设置调试文件:

-check-env: [checkenv] Android SDK 工具修订版 20.0.1 [checkenv] 安装在 /app/android-sdk-linux_86

-setup:[echo] 项目名称:LocationLib [gettype] 项目类型:Android 库

-设置调试模式:

-调试混淆检查:

-build-setup: [echo] Resolving Build Target for LocationLib... [gettarget] Project Target: Google APIs [gettarget] Vendor: Google Inc. [gettarget] Platform Version: 4.1 [gettarget] API level:
16 [echo] - --------- [echo] 如果需要,创建输出目录... [echo] ---------- [echo] 解析 LocationLib 的依赖项... [dependency] 库依赖项:[ dependency] No Libraries [dependency] [dependency] ------------------ [dependency] API<=15:将 annotations.jar 添加到类路径。

-预构建:

-code-gen: [mergemanifest] AndroidManifest 文件没有变化。[echo] 处理aidl 文件... [aidl] 没有要编译的AIDL 文件。[echo] ---------- [echo] 处理 RenderScript 文件... [renderscript] 没有要编译的 RenderScript 文件。[echo] ---------- [echo] 处理资源... [aapt] 没有更改的资源。R.java 和 Manifest.java 保持不变。[echo] ---------- [echo] 处理 BuildConfig 类... [buildconfig] 不需要生成新的 BuildConfig。

-预编译:

-compile: [echo] 创建库输出 jar 文件...

-编译后:

- 混淆:

-dex: [echo] 库项目:不转换字节码...

-crunch:[crunch] 在源目录中处理 PNG 文件:/home/ricky/Development/workspace/location_library/LocationLib/res
[crunch] 到目标目录:/home/ricky/Development/workspace/location_library/LocationLib/bin/res [crunch] 压缩 0 个 PNG 文件以更新缓存

-package-resources: [echo] 库项目:不打包资源...

-package: [echo] 库项目:不打包apk...

-后包装:

-do-debug: [echo] 库项目:不要创建 apk... [propertyfile] 更新属性文件:/home/ricky/Development/workspace/location_library/LocationLib/bin/build.prop [propertyfile] 更新属性文件: /home/ricky/Development/workspace/location_library/LocationLib/bin/build.prop [propertyfile] 更新属性文件:/home/ricky/Development/workspace/location_library/LocationLib/bin/build.prop [propertyfile] 更新属性文件: /home/ricky/Development/workspace/location_library/LocationLib/bin/build.prop

-构建后:

调试:

节点:

-设置模式检查:

-设置调试文件:

-check-env: [checkenv] Android SDK 工具修订版 20.0.1 [checkenv] 安装在 /app/android-sdk-linux_86

-setup:[echo] 项目名称:ExceptionHandlerLib [gettype] 项目类型:Android 库

-设置调试模式:

-调试混淆检查:

-build-setup: [echo] Resolving Build Target for ExceptionHandlerLib... [gettarget] Project Target: Android 4.1 [gettarget] API level:
16 [echo] ---------- [echo] 创建输出目录如果需要... [echo] ---------- [echo] 解析 ExceptionHandlerLib 的依赖项... [dependency] 库依赖项:[dependency] 没有库 [dependency] [dependency] ----- ------------- [dependency] API<=15:将 annotations.jar 添加到类路径。

-预构建:

-code-gen: [mergemanifest] AndroidManifest 文件没有变化。[echo] 处理aidl 文件... [aidl] 没有要编译的AIDL 文件。[echo] ---------- [echo] 处理 RenderScript 文件... [renderscript] 没有要编译的 RenderScript 文件。[echo] ---------- [echo] 处理资源... [aapt] 没有更改的资源。R.java 和 Manifest.java 保持不变。[echo] ---------- [echo] 处理 BuildConfig 类... [buildconfig] 不需要生成新的 BuildConfig。

-预编译:

-compile: [echo] 创建库输出 jar 文件...

-编译后:

- 混淆:

-dex: [echo] 库项目:不转换字节码...

-crunch:[crunch] 在源目录中处理 PNG 文件:/home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/res [crunch] 到目标目录:/home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/bin/res [crunch] 压缩 0 个 PNG 文件以更新缓存

-package-resources: [echo] 库项目:不打包资源...

-package: [echo] 库项目:不打包apk...

-后包装:

-do-debug: [echo] 库项目:不要创建 apk... [propertyfile] 更新属性文件:/home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/bin/build.prop [propertyfile] 更新属性文件: /home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/bin/build.prop [propertyfile] 更新属性文件:/home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/bin/build.prop [propertyfile] 更新属性文件: /home/ricky/Development/workspace/exception_handler_library/ExceptionHandlerLib/bin/build.prop

-构建后:

调试:

-预构建:

-code-gen: [mergemanifest] 将 AndroidManifest 文件合并为一个。[mergemanifest] 合并来自项目和 2 个库的清单。[mergemanifest] 警告:[AndroidManifest.xml:3, AndroidManifest.xml:3] 主清单有但库使用 targetSdkVersion='16' [mergemanifest] 注意:主清单缺少声明,默认值为 minSdkVersion 或 1。[mergemanifest ] 警告:[AndroidManifest.xml:3, AndroidManifest.xml:13] 主清单有但库使用 targetSdkVersion='16' [mergemanifest] 注意:主清单缺少声明,默认值为 minSdkVersion 或 1。

构建失败 /app/android-sdk-linux_86/tools/ant/build.xml:616: null

总时间:2秒

编辑

我查看/app/android-sdk-linux_86/tools/ant/build.xml:616并发现以下行抛出了 nullenabled="${manifestmerger.enabled}">

这是整个街区

我将尝试禁用清单合并选项,看看会发生什么

编辑

从 project.properties 中删除 manifestmerger.enabled=true 似乎解决了我的问题。该项目现在可以编译并完美运行。我想我应该将此错误报告给 android 团队。我的清单有以下条目

<uses-sdk android:minSdkVersion="7"  />

但是,如果我将 targetSdkVersion 提高到 7 以上,仍然不会调用 onActivityResult(),所以这并不能真正解决根本问题,但我的项目现在可以正常工作

4

5 回答 5

7

在片段中(错误的 startActivityForResult)

getActivty().startActivityForResult(intent, requestCode); 
// Cannot receive in fragment

在片段中(正确的 startActivityForResult)

startActivityForResult(intent, requestCode); 
// use Fragment.startActivityForRusult()
// not Activity.startActivityForRusult()

活动中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

在片段中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Do Action
}
于 2013-08-28T02:01:00.417 回答
2

这里有几个建议:

  • 如果您只是希望android:targetSdkVersion清单中没有,您应该能够在 Eclipse的Project Explorer中右键单击您的项目,然后选择Android Tools > Clear Lint Markers

  • 检查以确保您的所有Fragment和 -Activity派生类都从兼容性库 ( android.support.v4.app.Fragmentand android.support.v4.app.FragmentActivity) 中扩展了正确的类,并且没有一个意外地扩展了框架中的类 ( android.app.Fragmentand android.app.Activity)。

此外,如果您将您的项目设置为 16 以外的任何值,我发现您的项目无法编译,这很奇怪targetSdkVersion。问题/控制台/Lint 窗口中是否指出了任何特定问题?还请检查您是否有其他目标可用和/或选择为项目构建目标(右键单击项目,属性> Android)。

于 2012-08-05T21:14:35.413 回答
0

兼容性包中有一个错误(请参阅thisthis

于 2012-08-05T02:58:13.643 回答
0

下载最新的 ADT 后,请确保您还用这个覆盖了项目中的支持​​ jar:

android-sdk\extras\android\support\v4\android-support-v4.jar

在运行最新的 ADT 时,您可能会使用旧的 jar。

否则,如果父 Activity 没有调用,我只希望您的 Fragments不会收到他们的 onActivityResult() 调用super.onActivityResult(requestCode, resultCode, data);

编辑

明确添加这是我的项目所必需的:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}
于 2012-08-08T16:02:26.900 回答
0

从 project.properties 中删除 manifestmerger.enabled=true 似乎解决了我的问题。该项目现在可以编译并完美运行。我想我应该将此错误报告给 android 团队。我的清单有以下条目

<uses-sdk android:minSdkVersion="7"  />

但是,如果我将 targetSdkVersion 提高到 7 以上,仍然不会调用 onActivityResult(),所以这并不能真正解决根本问题,但我的项目现在可以正常工作

于 2013-01-20T15:22:30.483 回答