2017-08-29 93 views
3

對不起,如果有人已經問過這個。 我對Stack很新,​​我沒有找到解決方案。科爾多瓦和proguard:相機插件NPE拍攝

這裏是我縮小它後我的應用程序的使用形式的堆棧。

08-29 13:27:30.330 10037-10192/? E/PluginManager: Uncaught exception from plugin 
               java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference 
                at android.support.v4.content.FileProvider.parsePathStrategy(Unknown Source) 
                at android.support.v4.content.FileProvider.getPathStrategy(Unknown Source) 
                at android.support.v4.content.FileProvider.getUriForFile(Unknown Source) 
                at org.apache.cordova.camera.CameraLauncher.takePicture(Unknown Source) 
                at org.apache.cordova.camera.CameraLauncher.callTakePicture(Unknown Source) 
                at org.apache.cordova.camera.CameraLauncher.execute(Unknown Source) 
                at org.apache.cordova.CordovaPlugin.execute(Unknown Source) 
                at org.apache.cordova.PluginManager.exec(Unknown Source) 
                at org.apache.cordova.CordovaBridge.jsExec(Unknown Source) 
                at org.apache.cordova.engine.SystemExposedJsApi.exec(Unknown Source) 
                at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
                at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:7) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:154) 
                at android.os.HandlerThread.run(HandlerThread.java:61) 

這是我的ProGuard文件:

# ionic 
-keep class org.apache.cordova.** { *; } 
-keep class org.apache.cordova.camera.** { *; } 
-keep public class * extends org.apache.cordova.CordovaPlugin 
-keep class com.ionic.keyboard.IonicKeyboard.** { *; } 

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 
-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 
-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

# Not sure if needed, found it in several documentations 
-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 
-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 
-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

#-libraryjars ./libs/android-support-v4.jar 
-dontwarn android.support.v4.** 

-keep class android.support.v4.** { *; } 
-keep interface android.support.v4.** { *; } 
-keep public class * extends android.support.v4.** 
-keep public class * extends android.app.Fragment 
-keep class android.support.v4.content.FileProvider 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-dontwarn com.worklight.common.internal.WLTrusteerInternal* 
-dontwarn com.worklight.jsonstore.** 
-dontwarn org.codehaus.jackson.map.ext.* 
-dontwarn com.worklight.androidgap.push.GCMIntentService 
-dontwarn com.worklight.androidgap.plugin.WLInitializationPlugin 
-dontwarn android.net.SSLCertificateSocketFactory 
-dontwarn android.net.http.* 

-keepattributes *Annotation* 

如果我使用了「從庫中選擇」項目,一切正常,但每次我嘗試使用相機,我得到這個錯誤。

對於Android清單我有這樣的:

<?xml version='1.0' encoding='utf-8'?> 
<manifest android:hardwareAccelerated="true" android:versionCode="24" android:versionName="2.4" package="" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true"> 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize"> 
      <intent-filter android:label="@string/launcher_name"> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <provider 
      android:authorities="${applicationId}.provider" 
      android:exported="false" 
      android:grantUriPermissions="true" 
      android:name="android.support.v4.content.FileProvider"> 
      <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> 
     </provider> 
    </application> 
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

</manifest> 

請注意,我從清單刪除的軟件包名稱(這個職位上棧而已,我的體型有名字)

如果我用minifyenabled false刪除了proguard,該應用程序可以並處理相機。

我不知道什麼是收縮,我應該添加以保持? 或者,也許你有一個提示/提示,發現什麼是我的方法不好?

Thx。

回答

2

如果有人仍然停留在這個

此行添加到您的ProGuard規則

-keep class com.abc.xyz.BuildConfig { *; } 

其中com.abc.xyz是你的包名

就是這樣......

感謝我後來......

編碼快樂

+0

您是否看過我的文章?這些行已被寫入 –

+1

我讀過你的文章,但是我找不到你的proguard文件,我遇到了同樣的錯誤,並且解決方案爲我工作..... @ JolyVincent – MSD

+0

好的,非常感謝,那是的確如此。令我驚訝的是,這部分代碼被鏈接到相機插件,但這就是它! –

0

嗨,我解決了同樣的問題。有什麼classnotfounderror?在我的問題中,有一個NPE的classnotfoundexception底部。當我在proguard規則中添加了這個沒用的類時,問題就解決了。

我的問題日誌像 拋出java.lang.ClassNotFoundException:com.xyz.XYZ.BuildConfig

Uncaught exception from plugin java.lang.NullPointerException: 
Attempt to invoke virtual method 'android.content.res.XmlResourceParser 
android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference 
                                                                       at android.support.v4.content.FileProvider.parsePathStrategy(Unknown Source) 
                                                                       at android.support.v4.content.FileProvider.getPathStrategy(Unknown Source) 
                                                                       at android.support.v4.content.FileProvider.getUriForFile(Unknown Source) 
                                                                       at org.apache.cordova.camera.CameraLauncher.takePicture(Unknown Source) 
                                                                       at org.apache.cordova.camera.CameraLauncher.callTakePicture(Unknown Source) 
                                                                       at org.apache.cordova.camera.CameraLauncher.execute(Unknown Source) 
                                                                       at org.apache.cordova.CordovaPlugin.execute(Unknown Source) 
                                                                       at org.apache.cordova.PluginManager.exec(Unknown Source) 
                                                                       at org.apache.cordova.CordovaBridge.jsExec(Unknown Source) 
                                                                       at org.apache.cordova.engine.SystemExposedJsApi.exec(Unknown Source) 
                                                                       at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
                                                                       at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:7) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:145) 
                                                                       at android.os.HandlerThread.run(HandlerThread.java:61) 
09-03 11:38:37.630 6926-6926/com.xyz.XYZ D/SystemWebChromeClient: file:///android_asset/www/js/bundles/fileUploadMobile_bundle.js: Line 1 : Failed because: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference 
09-03 11:38:37.630 6926-6926/com.xyz.XYZ I/chromium: [INFO:CONSOLE(1)] "Failed because: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference", source: file:///android_asset/www/js/bundles/fileUploadMobile_bundle.js (1) 
09-03 11:38:37.690 6926-9554/com.xyz.XYZ D/BuildHelper: Unable to get the BuildConfig, is this built with ANT? 
09-03 11:38:37.690 6926-9554/com.xyz.XYZ W/System.err: **java.lang.ClassNotFoundException: com.xyz.XYZ.BuildConfig** 

之後加入proguard的規則該行

-keep public class com.xyz.XYZ.BuildConfig
  
-keepclassmembers class com.xyz.XYZ.BuildConfig {
  public *;
 } 
+0

沒有,有沒有堆棧後。事實上,正如我使用科爾多瓦,他產生了一些內省類,我的情況是它不會提供比我之前粘貼的堆棧更多的信息。 –

0

在清單文件添加此,在應用程序標籤內。我想這它的工作

這裏是我的清單XML文件的提供者部分:

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="${applicationId}.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths" /> 
    </provider> 
+0

對不起,您是否看過我的文章?我把我的android manisfest放進去了,你的意思已經在我的清單裏了。 –

1

我也正面臨着同樣的問題,下面解決這對我來說:

更新的配置.xml文件。

  • 打開項目文件夾中的config.xml文件。
  • 的<平臺名稱=「機器人」 >標籤裏面,添加以下代碼: <preference name="applicationId" value="{PACKAGE_ID}"/> 其中{}的package_id通過項目的Android應用包ID代替。
  • 保存config.xml文件。

參考:https://www.ibm.com/support/knowledgecenter/SSHS8R_7.1.0/com.ibm.worklight.dev.doc/dev/t_android_cam_api_24.html#t_android_cam_api_24

+0

這也適用於我,但我將偏好元素作爲子元素添加到了android平臺元素外部的控件元素。 –