我有一些项目#1,它是图书馆。
例如,它适用于 GCM (C2DM) 消息,并且my_package.permission.C2D_MESSAGE
在其清单文件中具有权限(和其他权限)。
我将项目#1(lib)连接到项目#2(一些应用程序)。
问题:是否可以从项目 #1 为项目 #2 自动激活权限?
我有一些项目#1,它是图书馆。
例如,它适用于 GCM (C2DM) 消息,并且my_package.permission.C2D_MESSAGE
在其清单文件中具有权限(和其他权限)。
我将项目#1(lib)连接到项目#2(一些应用程序)。
问题:是否可以从项目 #1 为项目 #2 自动激活权限?
目前没有。如果“library”的意思是“Android library project”,这在未来可能是可能的。
但是,在您的特定情况下,这可能永远不会奏效。一些 GCM 框架类将使用应用程序的包,无论使用 GCM 的代码是否在 Android 库项目中。
我已经让它与 AndroidStudio 和 mainfestmerging 一起使用。我拥有库项目中的所有 GCM 权限、广播接收器和意图接收器。我的图书馆中的意图服务在我的应用程序中调用了意图服务。在我的例子中,应用程序向库注册此服务名称并将其存储在数据库中,因此库意图服务知道要为应用程序使用哪个意图。我的应用程序中的任何地方都没有 GCM 代码或权限。这是我的图书馆清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.plasync.client.android"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- Needed for devices with 4.02 or earlier android -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="org.plasync.client.android.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="org.plasync.client.android.permission.C2D_MESSAGE" />
<!-- <uses-permission android:name="com.playsnc.client.android.data.permission.READ_WRITE"/>-->
<application android:label="" android:icon="@drawable/ic_launcher">
<!-- This is the signin activity for plAsync -->
<activity android:name="org.plasync.client.android.AsyncMultiplayerSetupActivity"
android:label="@string/SETUP_ACTIVITY_NAME"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
<!-- This is the intent for getting the local user. Apps that use plAsync must use this
intent to retrieve the local user, or allow the user to signin. Apps should
use startActivityForResult as the sigin activity may require user interaction -->
<intent-filter>
<action android:name="@string/SETUP_ASYNC_MULTIPLAYER_SESSION_ACTION"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name="org.plasync.client.android.gcm.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
</intent-filter>
</receiver>
<service android:name="org.plasync.client.android.gcm.GcmReceiveIntentLauncher"/>
</application>
</manifest>
这是我的应用程序清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.plasync.client.android.testapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="org.plasync.client.android.testapp.AsyncMultiplayerTestAppActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".search.FriendSearchActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
<service android:name=".AsyncMultiplayerTestAppMessageReceiver"/>
</application>
</manifest>
正如 CommonsWare 所指出的,你必须小心你的包。如我的 BroadcastReceiver 的代码所示,意图服务(库或应用程序)的 ComponentName 包始终是应用程序包。
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName receiveIntentLauncherComponent =
new ComponentName(context.getPackageName(),
GcmReceiveIntentLauncher.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(receiveIntentLauncherComponent)));
setResultCode(Activity.RESULT_OK);
}
}
另外,请注意您不能使用 Google BroadcastReceiver;您需要如上所述定义自己的。原则上我可以从广播接收器启动应用程序意图,但由于我从数据库中获取应用程序意图名称,因此不建议在广播接收器中执行此类操作。
希望有帮助。