尝试启动库项目活动

问题描述:

我有一个库项目和主项目,我尝试从主项目启动库项目中定义的活动。尝试启动库项目活动

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

清单为您主要的应用程序必须包含它希望使用所有活动的定义。它们在图书馆项目中不需要,因为它们不是从那里调用的。

您在库清单中的任何活动定义实际上什么都不做。

更新:您现在可以合并清单文件,如其他答案所述。

+0

并且没有办法从主proj启动库项目活动而没有在主proj清单中定义它?为什么我会收到安全异常? – Lemberg 2013-05-15 11:16:04

+0

正确。您希望使用的所有活动都必须在您的应用清单中定义。即使您使用Admob,Admob库中的活动也必须在您自己的清单中注册,否则系统将无法启动它们。 – Kuffs 2013-05-15 11:19:43

实际上,你可以声明在图书馆的清单,你想要的一切,然后在您的主项目申报

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