Jac*_*nkr 68 illegalargumentexception android-5.0-lollipop
我的代码工作在<5但在Android 5.0中我遇到了一个我不太明白的问题.
10-23 10:18:18.945: E/AndroidRuntime(8987): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.gms.analytics.service.START (has extras) }
Run Code Online (Sandbox Code Playgroud)
即使是现在,我的代码也适用于4.4.4及以下版本.那么我需要做什么?我将在下面发布相关代码.此外,在我的谷歌搜索期间,我发现这篇关于java.lang.IllegalArgumentException的帖子:服务意图必须是关于Android 5.0的显式,但我不明白它的含义.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxxxx.android.phone.xxxxx"
android:versionCode="3"
android:versionName="v1.2.4065" >
<uses-sdk android:minSdkVersion="12"
android:targetSdkVersion="21" />
<!-- Required for Google Analytics -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- For push notifications (GCM) -->
<permission android:name="xxxxx.android.phone.xxxxx.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="xxxxx.android.phone.xxxxx.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM connects to Google Services. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- GCM - We handle notifications differently if the app is running -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- Caching -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- The event subscribe button adds events to the calendar -->
<!-- <uses-permission android:name="android.permission.WRITE_CALENDAR" /> -->
<!-- <uses-permission android:name="android.permission.READ_CALENDAR" /> -->
<supports-screens
android:resizeable="true"
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
<application
android:name="xxxxx.xxxxxApplication"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:allowBackup="true"
android:largeHeap="true" >
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="xxxxx.android.phone.xxxxx" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="xxxxx.android.phone.xxxxx" />
</intent-filter>
</receiver>
<receiver
android:name="xxxxx.ConnectivityReceiver"
android:enabled="false" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<activity
android:name=".SplashActivity"
android:configChanges="locale|orientation"
android:theme="@style/Theme.Splash"
android:screenOrientation="portrait"
android:noHistory="true" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="@string/app_name"
android:theme="@style/Theme"
android:windowSoftInputMode="adjustPan|stateVisible"
android:name=".LoginActivity"
android:configChanges="locale|orientation|screenSize"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".MainActivity"
android:theme="@style/Theme"
android:configChanges="locale|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateVisible" />
<activity
android:name=".CountryPickerActivity"
android:theme="@style/Theme.Floating"
android:configChanges="locale|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateVisible" />
<activity
android:name=".EventPickerActivity"
android:theme="@style/Theme.Floating"
android:configChanges="locale|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateVisible" />
<activity
android:name=".TutorialActivity"
android:theme="@style/Theme.Transparent"
android:configChanges="locale|orientation|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".VideoPlayerActivity"
android:theme="@style/Theme"
android:configChanges="orientation|screenSize" />
<service android:name=".GCMIntentService" android:enabled="true" />
<meta-data android:name="com.crashlytics.ApiKey" android:value="xxxxxxxxxxxxxxxx"/>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
public class GCMIntentService extends GCMBaseIntentService {
private static final int ATTEMPTS_MAX = 3;
final static boolean USE_DEV = false;
final static String XXXXX = "https://xxxxx/api.php";
final static String XXXXX = "http://dev.xxxxx/api.php";
final static String SUBSCRIPTION_KEY = "xxxxxxxxxxxxxxx"; // unique per app
public GCMIntentService() {
super(xxxxxx.SENDER_ID);
if(GCMIntentService.USE_DEV) {
host = XXXXX;
} else {
host = XXXXX;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
我越看这个问题就越多,我认为它不在GCMIntentService.java.我应该发布我的堆栈跟踪,之前是:
10-23 13:17:08.095: E/AndroidRuntime(10560): FATAL EXCEPTION: GAThread
10-23 13:17:08.095: E/AndroidRuntime(10560): Process: xxxxx.android.phone.xxxxx, PID: 10560
10-23 13:17:08.095: E/AndroidRuntime(10560): java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.gms.analytics.service.START (has extras) }
10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674)
10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1773)
10-23 13:17:08.095: E/AndroidRuntime(10560): at android.app.ContextImpl.bindService(ContextImpl.java:1751)
10-23 13:17:08.095: E/AndroidRuntime(10560): at android.content.ContextWrapper.bindService(ContextWrapper.java:538)
10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.AnalyticsGmsCoreClient.connect(AnalyticsGmsCoreClient.java:82)
10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAServiceProxy.connectToService(GAServiceProxy.java:279)
10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAServiceProxy.createService(GAServiceProxy.java:163)
10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAThread.init(GAThread.java:95)
10-23 13:17:08.095: E/AndroidRuntime(10560): at com.google.analytics.tracking.android.GAThread.run(GAThread.java:493)
Run Code Online (Sandbox Code Playgroud)
因此,我将尝试将GA作为明确的意图运行.
mil*_*mns 44
如果您正在尝试使用Google的许可机制,那么解决方案对我有用:
// explicit Intent, safe
Intent serviceIntent = new Intent(ILicensingService.class.getName());
serviceIntent.setPackage("com.android.vending");
boolean bindResult = mContext.bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)
它位于com/google/android/vending/licensing/LicenseChecker.java.搜索" Base64.decode("
编辑:
添加对必须修补的Google Licensing java文件的引用:
com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
Run Code Online (Sandbox Code Playgroud)
补丁:
new String(
- Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))),
+ Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
+ .setPackage("com.android.vending"), // this fix the 'IllegalArgumentException: Service Intent must be explicit'
this, // ServiceConnection.
Run Code Online (Sandbox Code Playgroud)
来源:https://code.google.com/p/android/issues/detail?id = 78505#c19
小智 38
由于Android 5.0(Lollipop)必须始终使用显式意图调用bindService().这是以前的建议,但是自从Lollipop强制执行后:java.lang.IllegalArgumentException: Service Intent must be explicit
每次bindService()使用隐式意图进行调用时都会抛出它.隐式和显式意图之间的区别在于后者指定了按名称开始的组件(完全限定的类名).
请在此处查看有关意图类型的文档.
您遇到的问题是由于未升级到较新版本的Google库,这符合Android在Android 5 Lollipop上绑定服务时对隐式意图的限制.要解决此问题,您可以将库升级到更新版本(如果可用),或者自行更新库代码并使用修改后的版本构建项目.
如果在一般情况下没有合适的库升级,则需要修改源代码(在您的情况下 com.google.analytics.tracking.android.AnalyticsGmsCoreClient.connect())以在调用intent.setPackage(packageName)之前调用bindService()where 调用intent的第一个参数,bindService()并且packageName是包含代码尝试的服务的包的名称开始(在您的情况下为"com.google.android.gms.analytics").
您可以使用此代码作为示例如何执行此操作:Unity的Google许可库(LVL)的更新版本,它以明确的意图调用bindService,但不会导致IllegalArgumentException.
另一种解决问题的方法是使用targetSDK重建您的项目和谷歌库,不迟于19.这将使其在Lollipop上运行时不会崩溃但是安全性较低的选项会阻止您使用更高版本中引入的SDK功能(适用于Android 5).
小智 21
从Google Analytics v2迁移到v3可以解决我的问题.
Joe*_*nde 14
我自己就是这个问题.问题在于您的活动正在启动您的服务.
基本上,显式意图在服务启动时直接在intent中命名服务.有关更深入的说明,请参见http://developer.android.com/guide/components/intents-filters.html.
既然,你没有发布你的活动代码,我不知道你现在是怎么开始的,但它应该看起来像这样:
Intent startIntent = new Intent(this, ServiceToStart.class);
this.startService(startIntent); // or bindService(...)
Run Code Online (Sandbox Code Playgroud)
我用这个和它的伟大工程
public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
//Retrieve all services that can match the given intent
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
//Make sure only one match was found
if (resolveInfo == null || resolveInfo.size() != 1) {
return null;
}
//Get component info and create ComponentName
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);
//Create a new intent. Use the old one for extras and such reuse
Intent explicitIntent = new Intent(implicitIntent);
//Set the component to be explicit
explicitIntent.setComponent(component);
return explicitIntent;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54478 次 |
| 最近记录: |