Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call activity from a library module in android studio

I am trying to call an activity from a library module in my application. I keep getting the error

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.nextgis.mobile/com.nextgis.mobile.activity.MainActivity}; have you declared this activity in your AndroidManifest.xml?

I am calling the activity as

Intent intentGIS = new Intent(android.content.Intent.ACTION_VIEW);
intentGIS.setComponent(new ComponentName("com.nextgis.mobile",
                    "com.nextgis.mobile.activity.MainActivity"));
startActivity(intentGIS);

App manifest :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.disarm.sanna.pdm">

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.WRITE_SETTINGS" />

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

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.VIBRATE"/>


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

<uses-feature
    android:name="android.hardware.location"
    android:required="true"
    />
<uses-feature
    android:name="android.hardware.telephony"
    android:required="false"
    />
<uses-feature
    android:name="android.hardware.wifi"
    android:required="false"
    />
<!--
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false"
        />
    <uses-feature
        android:name="android.hardware.compass"
        android:required="false"
        />
-->


<supports-screens
    android:largeScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"
    android:normalScreens="true"
    android:xlargeScreens="true"
    android:resizeable="true"
    />

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:node="replace">
    <activity
        android:name=".SplashActivity"
        android:windowSoftInputMode="stateHidden|adjustUnspecified"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name="com.disarm.sanna.pdm.ShareActivity"
        android:label="@string/app_name">
    </activity>

    <activity android:name=".SelectCategoryActivity"
        android:label="@string/app_name">
    </activity>

    <activity android:name=".SocialShareActivity"
        android:label="@string/app_name">
    </activity>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
    <activity
        android:name=".ActivityList"
        android:windowSoftInputMode="stateHidden|adjustPan"
        android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
    </activity>
    <activity
        android:name=".Capture.Photo"
        android:theme="@style/AppCompatAlertDialogStyle"
        >
    </activity>
    <activity
        android:name=".Capture.Video"
        android:theme="@style/AppCompatAlertDialogStyle"
        >
    </activity>
    <activity
        android:label="Record Audio"
        android:name=".Capture.AudioCapture"
        android:theme="@style/Theme.AppCompat.Light.Dialog"
        >
    </activity>
    <activity
        android:label="@string/allow_setting"
        android:name=".WriteSettingActivity"
        android:theme="@style/AppTheme"
        >
    </activity>
    <service
        android:name=".Service.SyncService"
        android:enabled="true"
        android:exported="true" />
    <service android:name=".DisarmConnect.MyService" />
</application>
</manifest>

Library manifest :

<?xml version="1.0" encoding="utf-8"?>
<!--
~ Project:  NextGIS Mobile
~ Purpose:  Mobile GIS for Android.
~ Author:   Dmitry Baryshnikov (aka Bishop), [email protected]
~ Author:   NikitaFeodonit, [email protected]
~ Author:   Stanislav Petriakov, [email protected]
~      ******************************************************************************
~ Copyright (c) 2012-2016 NextGIS, [email protected]
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program.  If not, see     <http://www.gnu.org/licenses/>.
-->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.nextgis.mobile"
>



<application
    android:allowBackup="true"
    android:label="@string/app_name"
    >
    <activity
        android:name=".activity.MainActivity"
        android:label="@string/app_name"
        >
    </activity>

    <activity
        android:name=".activity.SettingsActivity"
        android:label="@string/action_settings"
        />

    <activity
        android:name=".activity.NGWSettingsActivityProxy"
        android:label="@string/ngw_settings"
        />

    <activity
        android:name=".activity.AboutActivity"
        android:label="@string/action_help"
        />

    <activity
        android:name=".activity.CreateVectorLayerActivity"
        android:label="@string/create_layer"
        android:screenOrientation="portrait"
        />

    <service
        android:name="com.nextgis.mobile.datasource.SyncService"
        >
        <intent-filter>
            <action
                android:name="android.content.SyncAdapter"
                />
        </intent-filter>
        <meta-data
            android:name="android.content.SyncAdapter"
            android:resource="@xml/syncadapter"
            />
    </service>

    <provider
        android:name="com.nextgis.maplib.datasource.LayerContentProvider"
        android:authorities="com.nextgis.mobile.provider"
        android:exported="false"
        android:syncable="true"
        />

</application>

</manifest>

I have added compile project(':gisapp') in the gradle file for the module app. I know gradle does manifest merging automatically but I could be wrong.

What am I doing wrong here ?

Note : This is the project which I am using as library.

like image 642
Arka Prava Basu Avatar asked Jan 04 '17 13:01

Arka Prava Basu


People also ask

How can I run a particular activity in Android Studio?

Choose Edit Configuration from the list. Now from the Launch Option Select the Specified Activity and start typing in the activity text input, the android studio will automatically show you the list of all activities, select one from them or write the name of your activity.

What is library module in Android Studio?

An Android library is structurally the same as an Android app module. It can include everything needed to build an app, including source code, resource files, and an Android manifest.

Which method is used to call another activity?

We can send the data using the putExtra() method from one activity and get the data from the second activity using the getStringExtra() method.

How do you call an activity in Java?

To start an activity, call startActivity() and pass it your Intent . The system receives this call and starts an instance of the Activity specified by the Intent .


1 Answers

We can use reflection to get class object.

Class.forName("com.mypackage.myMainActivity")

Add this code in Library project to call,

try {
      Intent myIntent = new Intent(this,Class.forName("com.mypackage.myMainActivity"));
      startActivity(myIntent );
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}

"com.mypackage.myMainActivity" is the Activity present in Main project, that we need to call from its Library project.

like image 114
siddhesh Avatar answered Sep 27 '22 15:09

siddhesh