2013-05-14 51 views
4

我有一個庫項目和主項目,我嘗試從主項目啓動庫項目中定義的活動。嘗試啓動庫項目活動

Intent intent = new Intent("isr.LAUNCH"); 
intent.setComponent(new ComponentName("com.ISR", "com.ISR.activity.CameraActivity")); 
startActivity(intent); 

但我收到以下異常:

05-14 17:13:42.853: E/AndroidRuntime(29217): java.lang.SecurityException: Permission Denial: starting Intent { act=isr.LAUNCH cmp=com.ISR/.activity.CameraActivity } from ProcessRecord{40aa7178 29217:com.ssbs.sw.SWE/10094} (pid=29217, uid=10094) requires null 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.os.Parcel.readException(Parcel.java:1322) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.os.Parcel.readException(Parcel.java:1276) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.app.Activity.startActivityForResult(Activity.java:2827) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.app.Activity.startActivity(Activity.java:2933) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at com.ssbs.sw.IR.view.MainActivity$1$1.onMenuItemClick(MainActivity.java:58) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at com.ssbs.sw.SWE.actionbarV5.menu.MenuButtonHelper$1.onClick(MenuButtonHelper.java:108) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.view.View.performClick(View.java:2492) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.view.View$PerformClick.run(View.java:9087) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.os.Handler.handleCallback(Handler.java:587) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.os.Looper.loop(Looper.java:130) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at android.app.ActivityThread.main(ActivityThread.java:3740) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at java.lang.reflect.Method.invokeNative(Native Method) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at java.lang.reflect.Method.invoke(Method.java:507) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:638) 
05-14 17:13:42.853: E/AndroidRuntime(29217): at dalvik.system.NativeStart.main(Native Method) 

這是庫項目清單我:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 

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

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 

     <activity android:name=".activity.CameraActivity" android:exported="true" > 
      <intent-filter> 
       <action android:name="isr.LAUNCH" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 
    </application> 

我該如何解決這個問題?

編輯
我的主要項目清單的權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="15" /> 

EDIT 2
我已經應對,以所謂的活動我的主要應用程序清單定義解決我的問題(但我想知道我是否可以在不添加此定義的情況下做到這一點):

<activity android:name="com.ISR.activity.CameraActivity"> 
      <intent-filter> 
       <action android:name="isr.LAUNCH" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 

現在我可以開始我用下面的代碼活動:

Intent intent = new Intent("isr.LAUNCH"); 
startActivity(intent); 
+0

將權限移動到您的主項目而不是您的庫項目? – 2013-05-14 14:28:06

+0

@NirvanaTikku我在我的主要項目清單 – Lemberg 2013-05-14 14:32:52

+0

有同樣的權限,以防萬一清理和重建這兩個項目。 – FoamyGuy 2013-05-14 14:40:45

回答

5

清單爲您主要的應用程序必須包含它希望使用所有活動的定義。它們在圖書館項目中不需要,因爲它們不是從那裏調用的。

您在庫清單中的任何活動定義實際上什麼都不做。

更新:您現在可以合併清單文件,如其他答案所述。

+0

並且沒有辦法從主proj啓動庫項目活動而沒有在主proj清單中定義它?爲什麼我會收到安全異常? – Lemberg 2013-05-15 11:16:04

+0

正確。您希望使用的所有活動都必須在您的應用清單中定義。即使您使用Admob,Admob庫中的活動也必須在您自己的清單中註冊,否則系統將無法啓動它們。 – Kuffs 2013-05-15 11:19:43

11

實際上,你可以聲明在圖書館的清單,你想要的一切,然後在您的主項目申報

manifestmerger.enabled=true 

在您的project.properties。它所做的實際上是合併你的Manifests,你可以在bin文件夾中看到最終的Manifest。

+0

它適用於較新的ADT(版本20預覽版3)及以上版本,您需要將其添加到您的應用程序項目的project.properties文件中。 – Lemberg 2013-11-25 09:32:51

+0

確實在SDK Tools第20修訂版中添加了它,但這並不意味着您無法使用它來編譯以前的應用程序。 [鏈接](http://developer.android.com/tools/sdk/tools-notes.html)我確實說過要包含在應用程序項目的project.properties中。乾杯! – Olaia 2013-11-26 14:04:19

+1

如何在project.properties現在是gradle.properties時配置manifestmerger? – 2016-08-03 18:13:29