Open facebook link in chooser with browsers - android

Сan we open the facebook link so that the menu selection of applications for viewing the content was still and facebook browsers? The standard startup
fun openLink(link: String) {
Intent(Intent.ACTION_VIEW).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
data = Uri.parse(link)
context.startActivity( this)
}
}
opens only browsers, and some browsers, such as chrome and edge, run another one, where then appears facebook (if it is installed), the only thing I was able to find was to open the links directly to facebook, if it is installed, without the possibility of choosing an application to open the link
Intent(Intent.ACTION_VIEW).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
try {
val applicationInfo: ApplicationInfo =
packageManager.getApplicationInfo("com.facebook.katana", 0)
if (applicationInfo.enabled) {
// http://stackoverflow.com/a/24547437/1048340
data = Uri.parse("fb://facewebmodal/f?href=https://facebook.com/")
}
} catch (ignored: PackageManager.NameNotFoundException) {
data = Uri.parse("https://facebook.com/")
}
startActivity(this)
}
what i have
what i want and what chorme send after open facebook link

are you familiar with EXTRA_INITIAL_INTENTS? create two separate Intents (if fb app present and enabled) and join them
Intent chooserIntent = Intent.createChooser(browserIntent, "Open in...");
if (fbIntent != null) {
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { fbIntent });
}
startActivity(chooserIntent);
some more info in HERE and HERE

Related

Possible to create an intent to show mail app options in android?

I would like to know if it is possible to have users open an email app of their choice without sending an email.
val intent = Intent(Intent.ACTION_SEND)
intent.type = "plain/text"
startActivity(Intent.createChooser(intent, "Choose Email"))
This allows the user to choose, but it opens the compose. I want just to open the email app.
This is a bit tricky, but not impossible.
Find all email clients
val resolveIntent = Intent(Intent.ACTION_SENDTO)
resolveIntent.setData(Uri.parse("mailto:default#recipient.com"))
val resolveInfoList = packageManager.queryIntentActivities(resolveIntent, PackageManager.MATCH_DEFAULT_ONLY)
Start email client
val intents = resolveInfoList.mapNotNull { info -> packageManager.getLaunchIntentForPackage(info.activityInfo.packageName) }.toMutableList()
if(intents.isEmpty()) {
//no mail client installed. Prompt user or throw exception
} else if(intents.size == 1) {
//one mail client installed, start that
startActivity(intents.first())
} else {
//multiple mail clients installed, let user choose which one to start
val chooser = Intent(Intent.ACTION_CHOOSER)
chooser.putExtra(Intent.EXTRA_INTENT, intents.removeAt(0))
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toTypedArray())
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(chooser)
}

Unable to share story using instagram sdk intent

We are following the official documentation for sharing stories from app to instagram
https://developers.facebook.com/docs/instagram/sharing-to-stories/
Expected behavior was that when i try to share a story the story screen of instagram app should open with the image send in the intent.
Actual behavior is the instagram app doesn't open and user stays on the same screen.
// Define image asset URI and attribution link URL
Uri backgroundAssetUri = "your-image-asset-uri-goes-here;"
String attributionLinkUrl = "https://www.my-aweseome-app.com/p/BhzbIOUBval/";
// Instantiate implicit intent with ADD_TO_STORY action,
// background asset, and attribution link
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setDataAndType(backgroundAssetUri, MEDIA_TYPE_JPEG);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra("content_url", attributionLinkUrl);
// Instantiate activity and verify it will resolve implicit intent
Activity activity = getActivity();
if (activity.getPackageManager().resolveActivity(intent, 0) != null) {
activity.startActivityForResult(intent, 0);
}
You can try this
private void shareToInstagram() {
path = tvSelectMedia.getText().toString().trim();
Intent intent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
if (intent != null) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setPackage("com.instagram.android");
try {
shareIntent.putExtra(Intent.EXTRA_STREAM, uri)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
shareIntent.setType("image/jpeg");
startActivity(shareIntent);
} else {
// bring user to the market to download the app.
// or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + "com.instagram.android"));
startActivity(intent);
}
}
try this code, it will open all instagram possible intents chooser like share in instagram feeds or in stories:
if (isPackageInstalled(this, "com.instagram.android")) {
val media = File(imagePath)
val uri = Uri.fromFile(media)
val targetedShareIntents = ArrayList<Intent>()
val shareIntent = Intent(android.content.Intent.ACTION_SEND)
shareIntent.setType("image/*")
shareIntent.putExtra(Intent.EXTRA_STREAM, uri)
val resInfo = getPackageManager().queryIntentActivities(shareIntent, 0)
if (!resInfo.isEmpty()) {
val packageName = "com.instagram.android"
val targetedShareIntent = Intent(Intent.ACTION_SEND)
targetedShareIntent.setType("image/*")
targetedShareIntent.putExtra(Intent.EXTRA_STREAM, uri)
targetedShareIntent.setPackage(packageName)
targetedShareIntents.add(targetedShareIntent)
val chooserIntent = Intent.createChooser(
targetedShareIntents.removeAt(0),
"Share"
)
chooserIntent.putExtra(
Intent.EXTRA_INITIAL_INTENTS,
targetedShareIntents.toArray(
arrayOfNulls<Parcelable>(
targetedShareIntents.size
)
)
)
startActivity(chooserIntent)
}
} else {
// "Instagram application is not installed !",
}
Here is method for checking if application is installed or not:
fun isPackageInstalled(c: Context, targetPackage: String): Boolean {
val pm = c.getPackageManager()
try {
val info = pm.getPackageInfo(targetPackage, PackageManager.GET_META_DATA)
} catch (e: PackageManager.NameNotFoundException) {
return false
}
return true
}
It's look like your code is in Java, Sorry but you can apply logic from above kotlin code :)
Working on my side use this
val intent = Intent("com.instagram.share.ADD_TO_STORY")
intent.type = "image/*"
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("interactive_asset_uri", stickerImageFile)
intent.putExtra("content_url", attributionURL)
Log.d("", activity.toString())
// Instantiate activity and verify it will resolve implicit intent
activity.grantUriPermission(
"com.instagram.android",
stickerImageFile,
Intent.FLAG_GRANT_READ_URI_PERMISSION
)
if (activity.packageManager.resolveActivity(intent, 0) != null) {
activeContext!!.startActivity(intent)
result.success("success")
} else {
result.success("error")
}
Finally, I tested and found a very good solution to share Videos, Photos on Instagram (The sticker option is currently not).
WARNING:- This method does not work on Emulator (for sometimes). But works fine on Real devices.
I created this code and tested it in all android APIs and works like charm.
The code is below
// This method share photos and videos on Instagram Story
`videoFile` -> you can use here your `imageFile` if you want to share images.
public void shareOnInstagram(File videoFile, Activity activity){
if (isPackageInstalled(this.getPackageManager())){
Uri uri = FileProvider.getUriForFile(this, getPackageName()+".provider", videoFile); // This code works properly if you are sharing your videos or photos from storage (device). Let me know or update my answer if you able to share online images to Instagram story.
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY"); // this is your intent
intent.setDataAndType(uri, "video/*"); // if you are sharing image file then add you type this "images/*" or "images/jpeg" if image is .jpeg
activity.grantUriPermission(
"com.instagram.android", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (activity.getPackageManager().resolveActivity(intent, 0) != null) {
activity.startActivityForResult(intent, 0);
}
}else { // this condition follow if Instagram not installed.
Toast.makeText(activity, "Instagram not found", Toast.LENGTH_SHORT).show();
}
}
// This method checks that Instagram installed or not.
private boolean isPackageInstalled(PackageManager packageManager) {
try {
packageManager.getPackageInfo("com.instagram.android", 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
To create a file provider. See this answer https://stackoverflow.com/a/18583876/16765223
to call this method
videoFile = "/storage/emulated/0/Android/data/com.example.app/files/tree/Videos/testingvideo01.mp4"
shareOnInstagram(videoFile,MyActivity.this); // add your videopath or imagepath and add your Complete Activity Name.
If any problem occurred. Let me know

How to open Google play store app directly without chooser intent [duplicate]

I have open the Google Play store using the following code
Intent i = new Intent(android.content.Intent.ACTION_VIEW);
i.setData(Uri.parse("https://play.google.com/store/apps/details?id=my packagename "));
startActivity(i);.
But it shows me a Complete Action View as to select the option (browser/play store). I need to open the application in Play Store directly.
You can do this using the market:// prefix.
Java
final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}
Kotlin
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")))
} catch (e: ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$packageName")))
}
We use a try/catch block here because an Exception will be thrown if the Play Store is not installed on the target device.
NOTE: Any app can register as capable of handling the market://details?id=<appId> URI. If you want to specifically target Google Play, the solution in Berťák's answer is a good alternative.
Many answers here suggest to use Uri.parse("market://details?id=" + appPackageName)) to open Google Play, but I think it is insufficient in fact:
Some third-party applications can use its own intent-filters with "market://" scheme defined, thus they can process supplied Uri instead of Google Play (I experienced this situation with e.g.SnapPea application). The question is "How to open the Google Play Store?", so I assume, that you do not want to open any other application. Please also note, that e.g. app rating is only relevant in GP Store app etc...
To open Google Play AND ONLY Google Play I use this method:
public static void openAppRating(Context context) {
// you can also use BuildConfig.APPLICATION_ID
String appId = context.getPackageName();
Intent rateIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=" + appId));
boolean marketFound = false;
// find all applications able to handle our rateIntent
final List<ResolveInfo> otherApps = context.getPackageManager()
.queryIntentActivities(rateIntent, 0);
for (ResolveInfo otherApp: otherApps) {
// look for Google Play application
if (otherApp.activityInfo.applicationInfo.packageName
.equals("com.android.vending")) {
ActivityInfo otherAppActivity = otherApp.activityInfo;
ComponentName componentName = new ComponentName(
otherAppActivity.applicationInfo.packageName,
otherAppActivity.name
);
// make sure it does NOT open in the stack of your activity
rateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// task reparenting if needed
rateIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// if the Google Play was already open in a search result
// this make sure it still go to the app page you requested
rateIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// this make sure only the Google Play app is allowed to
// intercept the intent
rateIntent.setComponent(componentName);
context.startActivity(rateIntent);
marketFound = true;
break;
}
}
// if GP not present on device, open web browser
if (!marketFound) {
Intent webIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id="+appId));
context.startActivity(webIntent);
}
}
The point is that when more applications beside Google Play can open our intent, app-chooser dialog is skipped and GP app is started directly.
UPDATE:
Sometimes it seems that it opens GP app only, without opening the app's profile. As TrevorWiley suggested in his comment, Intent.FLAG_ACTIVITY_CLEAR_TOP could fix the problem. (I didn't test it myself yet...)
See this answer for understanding what Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED does.
Go on Android Developer official link as tutorial step by step see and got the code for your application package from play store if exists or play store apps not exists then open application from web browser.
Android Developer official link
https://developer.android.com/distribute/tools/promote/linking.html
Linking to a Application Page
From a web site: https://play.google.com/store/apps/details?id=<package_name>
From an Android app: market://details?id=<package_name>
Linking to a Product List
From a web site: https://play.google.com/store/search?q=pub:<publisher_name>
From an Android app: market://search?q=pub:<publisher_name>
Linking to a Search Result
From a web site: https://play.google.com/store/search?q=<search_query>&c=apps
From an Android app: market://search?q=<seach_query>&c=apps
While Eric's answer is correct and Berťák's code also works. I think this combines both more elegantly.
try {
Intent appStoreIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName));
appStoreIntent.setPackage("com.android.vending");
startActivity(appStoreIntent);
} catch (android.content.ActivityNotFoundException exception) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}
By using setPackage, you force the device to use the Play Store. If there is no Play Store installed, the Exception will be caught.
try this
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.example.android"));
startActivity(intent);
All of the above answers open Google Play in a new view of the same app, if you actually want to open Google Play (or any other app) independently:
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.android.vending");
// package name and activity
ComponentName comp = new ComponentName("com.android.vending",
"com.google.android.finsky.activities.LaunchUrlHandlerActivity");
launchIntent.setComponent(comp);
// sample to open facebook app
launchIntent.setData(Uri.parse("market://details?id=com.facebook.katana"));
startActivity(launchIntent);
The important part is that actually opens google play or any other app independently.
Most of what I have seen uses the approach of the other answers and it was not what I needed hopefully this helps somebody.
Regards.
You can check if the Google Play Store app is installed and, if this is the case, you can use the "market://" protocol.
final String my_package_name = "........." // <- HERE YOUR PACKAGE NAME!!
String url = "";
try {
//Check whether Google Play store is installed or not:
this.getPackageManager().getPackageInfo("com.android.vending", 0);
url = "market://details?id=" + my_package_name;
} catch ( final Exception e ) {
url = "https://play.google.com/store/apps/details?id=" + my_package_name;
}
//Open the app page in Google Play store:
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(intent);
use market://
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + my_packagename));
As the official docs use https:// instead of market://, this combines Eric's and M3-n50's answer with code reuse (don't repeat yourself):
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
try {
startActivity(new Intent(intent)
.setPackage("com.android.vending"));
} catch (android.content.ActivityNotFoundException exception) {
startActivity(intent);
}
It tries to open with the GPlay app if it exists and falls back to default.
Some of the answers to this question are outdated.
What worked for me (in 2020) was to explicitly tell the intent to skip the chooser and directly open the play store app, according to this link:
"If you want to link to your products from an Android app, create an
Intent that opens a URL. As you configure this intent, pass
"com.android.vending" into Intent.setPackage() so that users see your
app's details in the Google Play Store app instead of a chooser."
This is the Kotlin code I used to direct users to viewing the app containing the package name com.google.android.apps.maps in Google Play:
val intent = Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.apps.maps")
setPackage("com.android.vending")
}
startActivity(intent)
I hope that helps someone!
Kotlin:
Extension:
fun Activity.openAppInGooglePlay(){
val appId = BuildConfig.APPLICATION_ID
try {
this.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appId")))
} catch (anfe: ActivityNotFoundException) {
this.startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=$appId")
)
)
}}
Method:
fun openAppInGooglePlay(activity:Activity){
val appId = BuildConfig.APPLICATION_ID
try {
activity.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appId")))
} catch (anfe: ActivityNotFoundException) {
activity.startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=$appId")
)
)
}
}
You can do:
final Uri marketUri = Uri.parse("market://details?id=" + packageName);
startActivity(new Intent(Intent.ACTION_VIEW, marketUri));
get Reference here:
You can also try the approach described in the accepted answer of this question:
Cannot determine whether Google play store is installed or not on Android device
Very late in the party Official docs are here. And code described is
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(
"https://play.google.com/store/apps/details?id=com.example.android"));
intent.setPackage("com.android.vending");
startActivity(intent);
As you configure this intent, pass "com.android.vending" into Intent.setPackage() so that users see your app's details in the Google Play Store app instead of a chooser.
for KOTLIN
val intent = Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse(
"https://play.google.com/store/apps/details?id=com.example.android")
setPackage("com.android.vending")
}
startActivity(intent)
If you have published an instant app using Google Play Instant, you can launch the app as follows:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri.Builder uriBuilder = Uri.parse("https://play.google.com/store/apps/details")
.buildUpon()
.appendQueryParameter("id", "com.example.android")
.appendQueryParameter("launch", "true");
// Optional parameters, such as referrer, are passed onto the launched
// instant app. You can retrieve these parameters using
// Activity.getIntent().getData().
uriBuilder.appendQueryParameter("referrer", "exampleCampaignId");
intent.setData(uriBuilder.build());
intent.setPackage("com.android.vending");
startActivity(intent);
For KOTLIN
val uriBuilder = Uri.parse("https://play.google.com/store/apps/details")
.buildUpon()
.appendQueryParameter("id", "com.example.android")
.appendQueryParameter("launch", "true")
// Optional parameters, such as referrer, are passed onto the launched
// instant app. You can retrieve these parameters using Activity.intent.data.
uriBuilder.appendQueryParameter("referrer", "exampleCampaignId")
val intent = Intent(Intent.ACTION_VIEW).apply {
data = uriBuilder.build()
setPackage("com.android.vending")
}
startActivity(intent)
Ready-to-use solution:
public class GoogleServicesUtils {
public static void openAppInGooglePlay(Context context) {
final String appPackageName = context.getPackageName();
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} catch (android.content.ActivityNotFoundException e) { // if there is no Google Play on device
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}
}
}
Based on Eric's answer.
Kotlin
fun openAppInPlayStore(appPackageName: String) {
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appPackageName")))
} catch (exception: android.content.ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$appPackageName")))
}
}
This link will open the app automatically in market:// if you are on Android and in browser if you are on PC.
https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.app.id&ddl=1&pcampaignid=web_ddl_1
If you want to open Google Play store from your app then use this command directy: market://details?gotohome=com.yourAppName, it will open your app's Google Play store pages.
Web: http://play.google.com/store/apps/details?id=
App: market://details?id=
Show all apps by a specific publisher
Web: http://play.google.com/store/search?q=pub:
App: market://search?q=pub:
Search for apps that using the Query on its title or description
Web: http://play.google.com/store/search?q=
App: market://search?q=
Reference: https://tricklio.com/market-details-gotohome-1/
Here is the final code from the answers above that first attempts to open the app using the Google play store app and specifically play store, if it fails, it will start the action view using the web version:
Credits to #Eric, #Jonathan Caballero
public void goToPlayStore() {
String playStoreMarketUrl = "market://details?id=";
String playStoreWebUrl = "https://play.google.com/store/apps/details?id=";
String packageName = getActivity().getPackageName();
try {
Intent intent = getActivity()
.getPackageManager()
.getLaunchIntentForPackage("com.android.vending");
if (intent != null) {
ComponentName androidComponent = new ComponentName("com.android.vending",
"com.google.android.finsky.activities.LaunchUrlHandlerActivity");
intent.setComponent(androidComponent);
intent.setData(Uri.parse(playStoreMarketUrl + packageName));
} else {
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(playStoreMarketUrl + packageName));
}
startActivity(intent);
} catch (ActivityNotFoundException e) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(playStoreWebUrl + packageName));
startActivity(intent);
}
}
I have combined both Berťák and Stefano Munarini answer to creating a hybrid solution which handles both Rate this App and Show More App scenario.
/**
* This method checks if GooglePlay is installed or not on the device and accordingly handle
* Intents to view for rate App or Publisher's Profile
*
* #param showPublisherProfile pass true if you want to open Publisher Page else pass false to open APp page
* #param publisherID pass Dev ID if you have passed PublisherProfile true
*/
public void openPlayStore(boolean showPublisherProfile, String publisherID) {
//Error Handling
if (publisherID == null || !publisherID.isEmpty()) {
publisherID = "";
//Log and continue
Log.w("openPlayStore Method", "publisherID is invalid");
}
Intent openPlayStoreIntent;
boolean isGooglePlayInstalled = false;
if (showPublisherProfile) {
//Open Publishers Profile on PlayStore
openPlayStoreIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://search?q=pub:" + publisherID));
} else {
//Open this App on PlayStore
openPlayStoreIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=" + getPackageName()));
}
// find all applications who can handle openPlayStoreIntent
final List<ResolveInfo> otherApps = getPackageManager()
.queryIntentActivities(openPlayStoreIntent, 0);
for (ResolveInfo otherApp : otherApps) {
// look for Google Play application
if (otherApp.activityInfo.applicationInfo.packageName.equals("com.android.vending")) {
ActivityInfo otherAppActivity = otherApp.activityInfo;
ComponentName componentName = new ComponentName(
otherAppActivity.applicationInfo.packageName,
otherAppActivity.name
);
// make sure it does NOT open in the stack of your activity
openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// task reparenting if needed
openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// if the Google Play was already open in a search result
// this make sure it still go to the app page you requested
openPlayStoreIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// this make sure only the Google Play app is allowed to
// intercept the intent
openPlayStoreIntent.setComponent(componentName);
startActivity(openPlayStoreIntent);
isGooglePlayInstalled = true;
break;
}
}
// if Google Play is not Installed on the device, open web browser
if (!isGooglePlayInstalled) {
Intent webIntent;
if (showPublisherProfile) {
//Open Publishers Profile on web browser
webIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/search?q=pub:" + getPackageName()));
} else {
//Open this App on web browser
webIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
}
startActivity(webIntent);
}
}
Usage
To Open Publishers Profile
#OnClick(R.id.ll_more_apps)
public void showMoreApps() {
openPlayStore(true, "Hitesh Sahu");
}
To Open App Page on PlayStore
#OnClick(R.id.ll_rate_this_app)
public void openAppInPlayStore() {
openPlayStore(false, "");
}
public void launchPlayStore(Context context, String packageName) {
Intent intent = null;
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
}
}
My kotlin entension function for this purpose
fun Context.canPerformIntent(intent: Intent): Boolean {
val mgr = this.packageManager
val list = mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
return list.size > 0
}
And in your activity
val uri = if (canPerformIntent(Intent(Intent.ACTION_VIEW, Uri.parse("market://")))) {
Uri.parse("market://details?id=" + appPackageName)
} else {
Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)
}
startActivity(Intent(Intent.ACTION_VIEW, uri))
KOTLIN :
create extension in context.
fun Context.openPlayStoreApp(pkgName:String?){
if(!pkgName.isNullOrEmpty()) {
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$pkgName")))
} catch (e: ActivityNotFoundException) {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=$pkgName")
)
)
}
}
}
Hope it should work.
Peoples, dont forget that you could actually get something more from it. I mean UTM tracking for example. https://developers.google.com/analytics/devguides/collection/android/v4/campaigns
public static final String MODULE_ICON_PACK_FREE = "com.example.iconpack_free";
public static final String APP_STORE_URI =
"market://details?id=%s&referrer=utm_source=%s&utm_medium=app&utm_campaign=plugin";
public static final String APP_STORE_GENERIC_URI =
"https://play.google.com/store/apps/details?id=%s&referrer=utm_source=%s&utm_medium=app&utm_campaign=plugin";
try {
startActivity(new Intent(
Intent.ACTION_VIEW,
Uri.parse(String.format(Locale.US,
APP_STORE_URI,
MODULE_ICON_PACK_FREE,
getPackageName()))).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(
Intent.ACTION_VIEW,
Uri.parse(String.format(Locale.US,
APP_STORE_GENERIC_URI,
MODULE_ICON_PACK_FREE,
getPackageName()))).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
A kotlin verison with fallback and current syntax
fun openAppInPlayStore() {
val uri = Uri.parse("market://details?id=" + context.packageName)
val goToMarketIntent = Intent(Intent.ACTION_VIEW, uri)
var flags = Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_MULTIPLE_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
flags = if (Build.VERSION.SDK_INT >= 21) {
flags or Intent.FLAG_ACTIVITY_NEW_DOCUMENT
} else {
flags or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
goToMarketIntent.addFlags(flags)
try {
startActivity(context, goToMarketIntent, null)
} catch (e: ActivityNotFoundException) {
val intent = Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/apps/details?id=" + context.packageName))
startActivity(context, intent, null)
}
}
Tested. This should work fine.
val context = LocalContext.current
val onOpenPlayStore: () -> Unit = {
try {
LOG.d(tag, "onOpenPlayStore ${context.packageName}")
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=${context.packageName}"))
startActivity(context, intent, null)
} catch (e: ActivityNotFoundException) {
var intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=${context.packageName}"))
startActivity(context, intent, null)
}
}
For Rate Application: Redirect to Playstore.
In Flutter, you can do it through a Platform channel Like this
Flutter Part:-
static const platform = const MethodChannel('rateApp'); // initialize
onTap: platform.invokeMethod('urls', {'android_id': 'com.xyz'}),
Now Android Native Part(Java):
private static final String RATEAPP = "rateApp"; // initialize variable
// Now in ConfigureFlutterEngine funtion:
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), RATEAPP)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("urls") && call.hasArgument("android_id")) {
String id = call.argument("android_id").toString();
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("$uri" + id)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + id)));
}
result.success("Done");
} else {
result.notImplemented();
}
}
);

Open Instagram User Profile

I managed to open the Twitter and Facebook user profile from my app. But I can not find any references to Instagram.
Is There a way to open Instagram in order to show a user profile like in twitter or facebook?
For instance, in order to get the Intent to launch the twitter application I do:
public Intent getOpenTwitterIntent(Context context) {
try {
return new Intent(Intent.ACTION_VIEW,
Uri.parse("twitter://user?screen_name="
.concat(twitterUsername)));
} catch (Exception e) {
return new Intent(
Intent.ACTION_VIEW,
Uri.parse("https://twitter.com/#!/".concat(twitterUsername)));
}
}
How can I achive something similar with Instagram?
Thanks in advance.
Here is a method to get the Intent to open the Instagram app to the user's profile page:
/**
* Intent to open the official Instagram app to the user's profile. If the Instagram app is not
* installed then the Web Browser will be used.</p>
*
* Example usage:</p> {#code newInstagramProfileIntent(context.getPackageManager(),
* "http://instagram.com/jaredrummler");}</p>
*
* #param pm
* The {#link PackageManager}. You can find this class through
* {#link Context#getPackageManager()}.
* #param url
* The URL to the user's Instagram profile.
* #return The intent to open the Instagram app to the user's profile.
*/
public static Intent newInstagramProfileIntent(PackageManager pm, String url) {
final Intent intent = new Intent(Intent.ACTION_VIEW);
try {
if (pm.getPackageInfo("com.instagram.android", 0) != null) {
if (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
final String username = url.substring(url.lastIndexOf("/") + 1);
// http://stackoverflow.com/questions/21505941/intent-to-open-instagram-user-profile-on-android
intent.setData(Uri.parse("http://instagram.com/_u/" + username));
intent.setPackage("com.instagram.android");
return intent;
}
} catch (NameNotFoundException ignored) {
}
intent.setData(Uri.parse(url));
return intent;
}
So far I couldn't find a way to show user's profile directly.. but there is a way around..
Found this solution from Instagram Manifest from GitHub
Intent iIntent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
iIntent.setComponent(new ComponentName( "com.instagram.android", "com.instagram.android.activity.UrlHandlerActivity"));
iIntent.setData( Uri.parse( "http://instagram.com/p/gjfLqSBQTJ/") );
startActivity(iIntent);
This will open particular image post by the user in the app. From the page app user can open the profile with the link inside.
If you want to open recent post or something , you can use Instagram API
This is not we want exactly , but the better option now... i guess :)
After a brief search and trying what we all know "WON'T WORK" I got this to work
Uri uri = Uri.parse("http://instagram.com/mzcoco2you");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
This should start your default browser and ... there you go. The answer is "instagram.com" + "/UserName".
To open directly instagram app to a user profile :
String scheme = "http://instagram.com/_u/USER";
String path = "https://instagram.com/USER";
String nomPackageInfo ="com.instagram.android";
try {
activite.getPackageManager().getPackageInfo(nomPackageInfo, 0);
intentAiguilleur = new Intent(Intent.ACTION_VIEW, Uri.parse(scheme));
} catch (Exception e) {
intentAiguilleur = new Intent(Intent.ACTION_VIEW, Uri.parse(path));
}
activite.startActivity(intentAiguilleur);
// Use this link to open directly a picture
String scheme = "http://instagram.com/_p/PICTURE";
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://instagram.com/_u/" + "username"));
intent.setPackage("com.instagram.android");
startActivity(intent);
}
catch (android.content.ActivityNotFoundException anfe)
{
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.instagram.com/" + username)));
}
Unfortunately, at this time you cannot open the Instagram app to go directly to a user profile. You can however open a certain photo in the Instagram app.
The following code that I have provided will open a certain photo inside of the Instagram app. If no Instagram app is installed, it will open a user profile inside of the browser.
public void openInstagram (View view) {
Intent intent = null;
String pictureId = "p/0vtNxgqHx9";
String pageName = "d4v3_r34d";
try {intent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
intent.setComponent(new ComponentName("com.instagram.android", "com.instagram.android.activity.UrlHandlerActivity"));
intent.setData(Uri.parse("http://instagram.com/" + pictureId));
} catch (Exception e) {
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://instagram.com/" + pageName));
}
this.startActivity(intent);
I made it very easy for this code to be edited for your own purposes. Set the "String pictureId" to the id of the picture that you want to display and set the "String pageName" to the user name of your Instagram account.
The user name part is obvious but if you need help to get your picture id look at this picture.
Check the code below:
Intent instaintent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
instaintent.setData(Uri.parse("https://www.instagram.com/insta_save_new/"));
startActivity(instaintent);

Open chat screen Skype from other app

Developing an application, In which I have many user's account_id(skype id), Now what I want is to open chat screen of Skype (already installed in device) when I click particular User's skype_id from my application.
I did search on web but got no success
Got the link how to start call on Skype but for chat?
1) Link 1
2) Link 2
You can use the Skype URI Scheme for this (Skype:echo123?chat).
You can find out more information about the URI Scheme here : https://dev.skype.com/skype-uri
Thanks
Allen Smith
Skype Developer Support Manager
Here is the code to open Skype chat conversation:
private void openSkype(Context context) {
// Make sure the Skype for Android client is installed
if (!isSkypeClientInstalled(context)) {
goToMarket(context);
return;
}
final String mySkypeUri = "skype:echo123?chat";
// Create the Intent from our Skype URI.
Uri skypeUri = Uri.parse(mySkypeUri);
Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
// Restrict the Intent to being handled by the Skype for Android client only.
myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
context.startActivity(myIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Determine whether the Skype for Android client is installed on this device.
*/
public boolean isSkypeClientInstalled(Context myContext) {
PackageManager myPackageMgr = myContext.getPackageManager();
try {
myPackageMgr.getPackageInfo("com.skype.raider", PackageManager.GET_ACTIVITIES);
} catch (PackageManager.NameNotFoundException e) {
return (false);
}
return (true);
}
/**
* Install the Skype client through the market: URI scheme.
*/
public void goToMarket(Context myContext) {
Uri marketUri = Uri.parse("market://details?id=com.skype.raider");
Intent myIntent = new Intent(Intent.ACTION_VIEW, marketUri);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myContext.startActivity(myIntent);
}

Categories

Resources