我有一些項目#1是庫。是否可以在Android框架(庫)中封裝權限
E.g.它適用於GCM(C2DM)消息,並且在其自身清單文件中擁有許可權(my_package.permission.C2D_MESSAGE
及其他)。
我將項目#1(lib)連接到項目#2(某些應用程序)。
問題:項目#2是否可以自動激活項目#1的權限?
我有一些項目#1是庫。是否可以在Android框架(庫)中封裝權限
E.g.它適用於GCM(C2DM)消息,並且在其自身清單文件中擁有許可權(my_package.permission.C2D_MESSAGE
及其他)。
我將項目#1(lib)連接到項目#2(某些應用程序)。
問題:項目#2是否可以自動激活項目#1的權限?
目前沒有。如果「圖書館」的意思是「Android圖書館項目」,這可能在未來。
但是,在您的具體情況下,這可能永遠不會工作。無論使用GCM的代碼是否在Android庫項目中,某些GCM框架類都將使用該應用程序的包。
我已經得到了這個與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所指出的,你必須要小心你的包。您的意圖服務的ComponentName包(庫或應用程序)始終是應用程序包,就像我的BroadcastReceiver的代碼所示。
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;你需要像上面那樣定義你自己的。原則上,我可以從廣播接收器啓動應用程序意圖,但是因爲我從數據庫中獲取應用程序意圖名稱,所以不建議在廣播接收器中執行此類操作。
希望有所幫助。
嗨CommonsWare ...我想知道如果我可以要求澄清這一點。 我有一個使用GCM的應用程序(比如說,包名「MyApp」)。我很快就需要維護這個應用程序的兩個不同版本,所以我正在考慮將「MyApp」變成另外兩個引用的庫項目(「MyApp-A」和「MyApp-B」)。 MyApp-A和-B必須能夠存在於同一個設備上,並獨立於彼此使用GCM。爲了實現這一點,我想我必須將GCM的東西從MyApp移出,並移入MyApp-A和MyApp-B,除了包名外,其他內容完全相同。這基本上就是你在這裏說的嗎? – Cephron
@Cephron:您的清單條目將需要位於MyApp-A和MyApp-B中。你的Java代碼可能在庫中 - 我不能想到GCM中會阻止這一點的任何東西。 – CommonsWare
@CommonsWare:我和Cephron描述的情況一樣。我在MyApp-A的清單中有GCMBroadcastReceiver條目,但onRegistered()回調沒有進入。具體來說,我已經嘗試了「MyApp」(庫項目)和「MyApp-A」(依賴項目) android:的名稱。我希望你是對的,但是你確定沒有必要將GCM代碼從庫中移出來,並放入每個相關的應用程序中?謝謝。 –
gcl1