I'm trying to implement App Shortcuts to my app, but i can't get them work.
My shortcut.xml:
<Shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="shortcut"
android:enabled="true"
android:icon="#drawable/ic_shortcut"
android:shortcutShortLabel="#string/shortcut_label">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example"
android:targetClass="com.example.package.Activity"/>
</shortcut>
manifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example">
<application
android:name=".Application"
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:resizeableActivity="false"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity
android:name=".package.Activity"
android:label="#string/app_name"
android:launchMode="singleTask"
android:theme="#style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="#xml/voice_search_params" />
<meta-data android:name="android.app.shortcuts"
android:resource="#xml/shortcuts" />
</activity>
So, i do shortcut same as in google example. I can see and click on shortcut, but nothing happens. I've tried different activities, changing activity location, activity action, params, like "exported=true", but nothing changes - in logs i can see only
ActivityNotFoundException: Shortcut could not be started
The only difference between my shortcut log, and google camera shortcut log is path to activity:
I/ActivityManager: START u0 {act=android.intent.action.VIEW flg=0x1000c000 cmp=com.example/.package.Activity}
vs
I/ActivityManager: START u0 {act=android.media.action.STILL_IMAGE_CAMERA flg=0x1000c000 cmp=com.google.android.GoogleCamera/com.android.camera.activity.CameraImageActivity}
Google cam has full path to activity, but package path differs.
PS: tried today google sample, static app shortcuts doesn't work in sample too. Dynamic app shortcuts work well.
In addition to Matin's answer, if you have multiple build types that change your application id, it won't work.
In my case, I had .debug and .qa suffix for application id. You can't reference to string reference or use variables inside intent element.
I found two solutions:
1) You will create different shortcuts.xml file for different build types and update your targetPackage.
For example,
<intent
android:action="com.example.ACTION"
android:targetClass="com.example.MainActivity"
android:targetPackage="com.example.debug"/>
2) There is a plugin that allows you to use applicationId variable in your XML file.
https://github.com/timfreiheit/ResourcePlaceholdersPlugin
android:targetPackage have to contain your application ID. So if you have defined your app id in build.gradle as applicationId "com.my.app.id" you have to use android:targetPackage="com.my.app.id"
Change the package name on your Activity to:
android:name=".Activity"
Change your shortcut target class to:
android:targetClass="com.example.Activity"
I also met this problem. Then i found that android:targetClass is not right path.
android:targetClass="com.example.camille.testappshortcuts.Main"
Main is app's access.
Maybe you should change Activity to another name, then add it.
Related
I'm working on an Android library project, in the default src/main/AndroidManifest.xml, the MainActivity is the launcher activity.
For the sake of something else, I created product flavors. Yes, it works perfect if I want to trigger / show different activitis inside different product flavors. However, I wanna keep the default launcher activity from src/main/ folder, while register another flavored activity as the new launcher activity. So that for different product flavors, I could have different launcher activities, and from them I could still start original "launcher" activity in src/main/.
Could anyone kindly tell me how to achive that? Thanks a lot.
Notes:
Adding if (BuildConfig.FLAVOR.equals("flavorName")) code to original launcher activity is not prefered. Because I don't want to modify the production code from someone else (this is a library project).
I've tried manifestmerger and tools:replace, but seems like it doesn't work for intent-filter (I noticed that the element merging policy for intent-filter is always).
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
If this may work, could you please kindly guide me how to make it work? Thanks.
What I have tried:
Enabling Manifest Merger, which doesn't work;
Using activity-alias, which doesn't work either.
Finally I found out that the problem could be solved by just adding one line:
<category android:name="android.intent.category.DEFAULT" />
==================================================
To make it clear, I'll go through the problem and solution one more time:
Under src/main/java there is a MainActivity, and in corresponding src/main/AndroidManifest.xml it specifies MainActivity as the launcher activity:
<activity android:name=".MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
That is a very easy part. Now we start with the product flavor part.
Due to some reason, in a product flavor, I don't want to overwrite the MainActivity, instead, I have a YetAnotherMainActivity. The goal is to set the YetAnotherMainActivity as the new launcher activity in the product flavor, and it should still be able to call MainActivity.
And here, is how you can set the new activity in product flavor as the new launcher activity:
flavorX/AndroidManifest.xml:
<activity android:name="com.example.YetAnotherMainActivity"
android:label="#string/title_yet_another_main_activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Yep, it turns out deadly easy. Just add android.intent.category.DEFAULT.
I think that <activity-alias> fits there more than any other solution (have no idea why #JingLi couldn't get it working. Maybe there were some troubles year ago, but for now it's okay).
For example, we have the following manifest in main:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.application">
<application>
<activity android:name=".InfoActivity"/>
<activity-alias
android:name="com.example.application.Launcher"
android:targetActivity=".InfoActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
</application>
</manifest>
And we want to replace launcher activity with DebugInfoActivity from debug flavor. So, we need to just replace the targetActivity attribute in the specified <activity-alias> tag:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name=".DebugInfoActivity"/>
<!-- to not litter the manifest -->
<activity
android:name="com.example.application.InfoActivity"
tools:node="remove"/>
<activity-alias
android:name="com.example.application.Launcher"
android:targetActivity=".DebugInfoActivity"
tools:replace="android:targetActivity"/>
</application>
</manifest>
Notes:
In the example we use the same package name for main and debug.
We have to enter the full name for activity-alias, so the merger can merge their correctly.
With the solution we also can inherit all attributes and childs from main activity-alias to not duplicate their in debug.
I guess I am not late :)
So today I got the same problem. #seroperson solution was correct but If you do not want the default launcher activity at all then just use the below code in your flavor's manifest:
<activity
android:name=".DefaultLauncherActivity"
tools:node="remove"
>
Android merger is merging intent-filter from main manifest lancher to flavors. I have not found way to prevent that. You end up with 2 app icons on device (each for launcher Activity).
Based on that, you cannot override completely settings from main manifest. Solition may be to keep only shell of manifest in main folder and implement manifest in each flavor or to remove conflict Activities from main folder and implemenent independently in each flavor.
<?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.adamassistant.app">
<!-- empty shell, implementation in flavors folders -->
</manifest>
The simplest and cleanest solution is to keep only one Manifest and write two different MainActivity.java class one for each flavor in order to avoiding duplication of manifest nodes.
Given two flavors in gradle
productFlavors {
paid {
packageName "com.example"
}
demo {
packageName "com.example.demo"
}
}
Given this project structure
app/
|--libs/
|--src/
|--paid/
| |--java/
| |--com/example/
| |--MainActivity.java
|--demo/
| |--java/
| |--com/example/
| |--MainActivity.java
|--main/
|--java/
| |--...
|--res/
| |--...
|--AndroidManifest.xml
And this Android Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flavors">
<application
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme">
<activity
android:name=".MainActivity"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Create a different AndroidManifest.xml file in your flavor. And there set your DifferentFlavorMainActivity.java as the launcher activity with full name like:
android:name="com.android.application.paid.MainActivity"
The working simplest solution is to use manifest merging and using
<intent-filter tools:node="removeAll">
as suggested in the following post :
Merging android manifest files, conflicting filter
Can anyone tell me how to change the app name? My app is taking splash as the app name on the Emulator since my first activity is splash.
EDIT:
It takes "splash" as the app name before the app is launched. Once it is launched the right name is displayed.
Manifest:
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="com.sanginfo.temperatureconvertor.SplashActivity"
android:label="#string/title_activity_splash" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.sanginfo.temperatureconvertor.LoginActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.LoginActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
In your manifest file under application tag change this tag with whatever you want as a app name..android:label="#string/app_name"
use the name attribute on application node as describe in :
http://developer.android.com/guide/topics/manifest/application-element.html
#stylojack_10
Go to the File name String.xml (Project->res->values->string.xml)
change the value of the tag name app_name.
you can even make your own tag there and make change in Android Manifest file under tag find android:label="#string/"your custom app name""
Hope this will resolve your problem
Solution 1: (this solution works most of the time)
Go to res -> values -> strings.xml -> appname, change name of the app there.
No go to Android Manifest and check if it looks like this:
<application
android:label="#string/app_name"
.......................
>
If android:label="#string/app_name" is changed to android:label="MyApp", than change it to one shown above. Your problem should be solved.
Solution 2:
there was a file called OldAppName.launch
it is located in workspace/.metadata/.plugins/org.eclipse.debug.core/.launches
also stuff on:
/User/workspace/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings
also a glitch in Eclipse to show old app name instead of changing the name.
I implemented a android project named 'vignesh', in which i had source package as com.example.learn.android. In my tab while uninstalling the app, its showing com.example.learn instead of project name alone. Please advice..
You can specify your application label in the AndroidManifest.xml
<application
android:label="#string/app_name"
...>
</application>
In the above example you have to define app_name in res/strings.xml
<string name="app_name">My app name</string>
If this is not working in the AndroidManifest.xml file:
<application
android:label="#string/app_name"
...>
</application>
Look for the startup activity(the activity with the android.intent.action.MAIN & android.intent.category.LAUNCHER), example:
<activity
android:name=".SplashScreen"
android:label="com.example.learn"
android:noHistory="true"
android:screenOrientation="landscape"
android:theme="#android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
You probably have the android:label mentioned just like the example above. The strange thing is that Android takes your first activity's name (label) as app name (I don't know why).
If you just remove (or rename) the android:label="com.example.learn" line it should be ok. Removing the line ensures that the app will look for the android:label tag defined in the <application> part of the AndroidManifest.xml file.
Is there a way to change the name (Launcher App Label) of an app without creating a new project?
Note: Name of the App and The label shown on the Launcher Icon on Home Screen on Mobiles can be different.
Example: On the home page in my Mobile where my apps are, I have an icon and the name Foo, but I want to change the name to Bar. Can I do this?
Yes you can. By changing the android:label field in your application node in AndroidManifest.xml.
Note: If you have added a Splash Screen and added
<activity
android:name=".SplashActivity"
android:label="#string/title_activity_splash_screen"
android:theme="#style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
to your Splash Screen, then the Launcher Icon name will be changed to the name of your Splash Screen Class name.
Please make sure that you change label:
android:label="#string/title_activity_splash_screen"
in your Splash Screen activity in your strings.xml file. It can be found in Res -> Values -> strings.xml
See more here.
There's the android:label for the application, and the android:label for the launch activity. The former is what you see under Settings -> Applications -> Manage Applications on your device. The latter is what you see under Applications, and by extension in any shortcut to your application, e.g.
<application
android:label="#string/turns_up_in_manage_apps" >
<activity
android:name=".MainActivity"
android:label="#string/turns_up_in_shortcuts" >
...
</activity>
</application>
This is a simple thing in Android Studio,
go to: res folder -> values -> strings.xml
change the app_name (in the bellow example:MitsuhoSdn Bhd) to any new name you want.
<string name="app_name">MitsuhoSdn Bhd</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
I noticed there are some differences in how the app name can turn up in Lollipop devices. Before Lollipop, you can have different app names with this:
<application
android:label="#string/app_name"> // appears in manage app info
<activity
android:name=".MainActivity"
android:label="#string/action_bar_title"> // appears in actionbar title
<intent-filter android:label="#string/name_in_icon_launcher"> // appears in icon launcher
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
...
In Lollipop, it will be like this:
<application
android:label="#string/name_in_manage_app_info">
<activity
android:name=".MainActivity"
android:label="#string/name_in_actionbar_and_icon_launcher">
<intent-filter android:label="#string/this_is_useless">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
In Lollipop, android:label in intent-filter is basically useless, while actionbar title and icon launcher is identical. So, if you want a different title in actionbar, you have no choice but to set dynamically
getSupportActionBar().setTitle(R.string.app_name);
You might have to change the name of your main activity "android:label" also, as explained in Naming my application in android
It depends what you want to do. I personally wanted to rename my project so it didn't say MainActivity at the top of the app and underneath the icon on my phone menu.
To do this I went into the Android Manifest.xml file and edited
<activity
android:name=".MainActitivity"
android:label="#string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
And edited the android:name=".Mynewname" and then edited the string title_activity_main in the strings.xml file to match the name.
Hope that helps!
if you want to change app name under launcher icon then change this android:label="#string/app_name"
inside your Main Launcher activity tag
<activity android:name="com.test.app"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
And if you want to change app name inside
Settings -> Application manager -> downloaded
where you have all installed applications then change this android:label="#string/app_name"
inside application tag
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
........
<activity android:name="com.test.app" >
</activity>
.......
</application>
To change the name of your Android application in Android Studio or Eclipse, you have to change the value of the property android:label defined inside the <application> node in AndroidManifest.xml
android:label="My Cool Application!"
by default the name of the application is referenced to a string defined in strings.xml file, for example:
android:label="#string/app_name"
so, we have to change the value inside the strings.xml file:
<string name="app_name">My Cool Application!</string>
<application
android:icon="#drawable/app_icon"
android:label="#string/app_name">
<activity
android:name="com.cipl.worldviewfinal.SplashActivity"
android:label="#string/title_activity_splash" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
To change android app's name , go to activity which is launcher activity and change its label like I have done above in my code.
If you're using android studio an item is under your strings.xml
<string name="app_name">BareBoneProject</string>
It's better to change the name here because you might have used this string somewhere.Or maybe a library or something has used it.That's it.Just build and run and you'll get new name.Remember this won't change the package name or anything else.
Nevermind I found it. It can be done in the manifest file under application just set the android label. Was thrown off at first becasue it didn't change my shortcut of the application's name.
Go to Strings.xml file under values.
Change the app_name tag to your app_name to want and it is all set, you will be able to see the name you change now.
follow the steps:(let I assuming you have chosen Android view)
app>res>values>strings
<string name="app_name">Put your App's new name here</string>
Edit the application tag in manifest file.
<application
android:icon="#drawable/app_icon"
android:label="#string/app_name"
android:theme="#android:style/Theme.Black.NoTitleBar.Fullscreen" >
Change the label attribute and give the latest name over there.
The change in Manifest file did not change the App name,
<application android:icon="#drawable/ic__logo" android:theme="#style/AppTheme" android:largeHeap="true" android:label="#string/app_name">
but changing the Label attribute in the MainLauncher did the trick for me .
[Activity(Label = "#string/app_name", MainLauncher = true, Theme = "#style/MainActivityNoActionBarTheme", ScreenOrientation = ScreenOrientation.Portrait)]
Old question but also now relative to Xamarin Android development:
As Xamarin allows for attributes to be used for adding items into the manifest, you may need to open your MainActivity.cs file and change the Label tag to your application's name:
Note: This attribute will override written android:label= tags in your manifest file as I found out whilst archiving the app ready for release so be sure to change this attribute too.
Yes Of-course........Android Supports to change the name of the App before making build just like iOS (Build Configuration).
You can change it by Modifying the Android manifest file for the project.
If you are here because when you tried to upload your fresh/brand new application using the play console it displayed this error:
"You must use another package name because "some.package.name" already exists in Google Play."
You just need to go to your build.gradle file (your application) and change
applicationId "some.package.name"
to
applicationId "some.package.different-unique-name"
Other answers here didn't fix this error.
in my case i need invalidate/cache and restart and its work
change the app string resource to your new activity
I defined an application which is only used from my other application. So I would like to hide the icon of this application, so that the user can't see it on the desktop of his phone (or how do you call the thing where all apps are listed?). My manifest file looks the following way:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xyz.games.pacman.controller"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<application android:icon="#drawable/icon" android:label="#string/app_name">
<activity android:name=".PacmanGame"
android:label="#string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="pacman.intent.action.Launch" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<receiver android:name="xyz.games.pacman.network.MessageListener">
<intent-filter>
<action android:name="xyz.games.pacman.controller.BROADCAST" />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
I already read this question:
How to hide an application icon in Android emulator?
but if i just remove the line
<category android:name="android.intent.category.DEFAULT" />
in my manifest, the activity isn't working at all (ActivityNotFoundException in the calling activity).
Any hints how to solve this problem? I already tried android.intent.category.EMBEDDED but this doesn't work too.
In the Internet I found CommonsWare answer http://osdir.com/ml/Android-Developers/2010-06/msg03617.html that it can be done using PackageManager. Unfortunately, it isn't explained how exactly and I couldn't find a solution by browsing the PackageManager API.
You need to create a custom intent filter and then create an intent which uses that filter.
For example, in my Funky Expenses application external apps can add transactions. This is achieved by the manifest for Funky Expenses containing
<activity android:name="com.funkyandroid.banking.android.ExternalEntryActivity">
<intent-filter>
<action android:name="com.funkyandroid.action.NEW_TRANSACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
and then external application can access my activity in the following way;
Intent launchIntent = new Intent();
launchIntent.setAction("com.funkyandroid.action.NEW_TRANSACTION");
... code to set parameters to be passed to activity ...
startActivity(launchIntent);
Pay special attention to the setAction call which sets the correct intent.
why would you write an actual (executable) second application that merely exists to do something when it receives sth from another app?
i'd suggest, you implement this "app" as a service (remote or local). this service would then run in the background and do stuff for you and there won't be any icons to be displayed on the screen for it...
if neccessary, you can implement this service to be remote, meaning it runs in a totally different process then the first app. and: you actually can communicate via broadcast intents as you seem to do by now so you won't need to change your first app...
Try removing the intent-filter and instead of trying to launch the 2nd activity with the filter lounch directly the activity:
Intent second = new Intent(context, xyz.games.pacman.controller.PacmanGame.class);
startActivity(second);
You must remove the whole <intent-filter>, not just the <category>