Registering my React Native App to the ShareAction possibilities in Android - android

I have found a several of reverse examples: sending from a React App to another one using intents.
I have found a blog post of a guy explaining how to do this with IOS.
But not on android. :(
What I understand from there is I need to add something in the `AndroidManifest.xml' file:
<activity android:name=".ShareLink">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
Am I right that this is the APP_ROOT/node_modules/react-native/ReactAndroid/src/main/AndroidManifest.xml file?
Should it look like that then?
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.facebook.react">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application />
<activity android:name=".ShareLink">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
</manifest>
How do I create the Intent?
Once my app is in the list (wohoo), how do I get back the data in the React App?
Any help would be highly appreciated. I'm a web developper, love React, but completely n00b to Android.

To get my app in the share list, it wasn't so hard at the end:
In <APP_ROOT>/android/app/src/main/AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.appname">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:label="#string/app_name"
android:icon="#mipmap/ic_launcher"
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>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
But once it is in the list, to make it accessible to the React App, that was complicated. I detailed the steps in the next answer following another subquestion: https://stackoverflow.com/a/33969430/1620081

Related

App icon doesn't appear after implementing deep links to my app

I'm developing an app in Android Studio it works pretty well, but after implementing deep links to my launching activity my app doesn't you the app icon in the menu, I know the app is installed cause in Setting>Applications it appears. I know the problem is in the manifest.xml, so I'll leave a copy down bellow.
I'll love to hear about your solutions, by the way if you are reading this thanks.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dev.misterj.nocherd">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permision.CALL_PHONE"/>
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyAiJNpq-********************" />
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:roundIcon="#mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="#xml/network_security_config"
android:theme="#style/AppTheme">
<activity android:name=".StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "https://myapp.com/place” -->
<data android:scheme="https" android:host="myapp.com" android:pathPrefix="/place" />
<!-- Accepts URIs that begin with "myapp://place” -->
<data android:scheme="myapp" android:host="place" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label="#string/app_name"
android:theme="#style/AppTheme.NoActionBar">
</activity>
</manifest>
You should separate the intent filters, also your manifest file is not well-formatted. you should close the application tag. you can open it with an external application like google chrome, it will tell you if the XML is not in correct format.
<activity android:name=".StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="place"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="myapp.com" android:pathPrefix="/place" />
</intent-filter>
</activity>
it's important that you create separate filters when your intention is to declare unique URLs (such as a specific combination of scheme and host) because multiple <data> elements in the same intent filter are actually merged together to account for all variations of their combined attributes. if you combine them it actually supports https://place and also supports myapp://myapp.com/place.
So you should separate them.

How can I open my React Native App from the browser?

I would like to open my app from the browser.
example: I open a browser, type in: https://open.my.app, or app://www.example.com and have my app as an option come up.
I read about Deep Links and I am quite sure I set up my project properly, YET nothing happens when I either try to type and run: https://open.my.app, app://www.example.com
My AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.somemobileapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:name=".MainApplication"
android:label="#string/app_name"
android:icon="#mipmap/ic_launcher"
android:allowBackup="false"
android:theme="#style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:label="#string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Change these two in the future to a proper one -->
<data android:scheme="https" android:host="www.example.com" />
<data android:scheme="app" android:host="open.my.app" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
So even after this, it's not working.
I know it will sound strange but keeping the data tag on first worked for me
<intent-filter>
<!-- data on first -->
<data android:scheme="http" android:host="abc.in"/>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

Comcast XfinityStream Android App APK Fire TV Stick

I have a Amazon Fire TV Stick (Gen 2) and I have been trying to sideload my Comcast XfinityStream APK to the device so I can watch live TV from the service I pay for. It is successfully installed on the device, but when I open it, it just shows a black screen and goes back to the main menu on the Fire Stick. I used a couple of the older versions, which up until recently worked fine, but they have since retired them and now none of them work. I am trying to get their newest play store app release to work correctly.
My main question is this: what causes an Android app to open, show a black screen, and within no time, goes back to the main menu screen on an Android device, with no errors or messages displayed? Does the Fire TV stick, being that is Android-based, have a directory where I check for logs of some sort when this type of app behavior happens?
Since the Fire TV stick is Android-based architecture on 5.x Lollipop, it should load up the same way as it does on my phone, in theory, but it doesn't. I have downloaded the APK file and looked into the manifests file, but haven't seen anything in there or a few other places I've looked that could show some type of restriction or 'blacklisting', if you will, the Fire TV stick from being able to use it. The API levels look correct as well as the hardware requirements. Does anyone have an idea what this could be? Here is the manifests file when it was decompiled:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:"http://schemas.android.com/apk/res/android" android:versionCode="40201001" android:versionName="4.2.1.001" android:installLocation="auto" package="com.xfinity.cloudtvr" platformBuildVersionCode="24" platformBuildVersionName="7.0">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="24" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.xfinity.cloudtvr.permission.C2D_MESSAGE" android:protectionLevel="signature|signatureOrSystem" />
<uses-permission android:name="com.xfinity.cloudtvr.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application android:theme="0x7f0c010c" android:label="#string/app_name" android:icon="0x7f0200da" android:name="com.xfinity.cloudtvr.XtvApplication" android:allowBackup="false" android:largeHeap="true" android:supportsRtl="true" android:resizeableActivity="false" android:networkSecurityConfig="0x7f060001">
<activity android:theme="0x7f0c010d" android:label="" android:name="com.xfinity.cloudtvr.view.BrowseActivity" android:launchMode="singleTop" android:windowSoftInputMode="20">
<intent-filter>
<data android:scheme="#string/localytics_push_key" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity android:name="com.xfinity.cloudtvr.view.authentication.WebAuthCallbackHelperActivity" android:exported="true">
<intent-filter>
<data android:scheme="#string/partner_continue_url_scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="com.comcast.cim.android.view.launch.IntentForwardingActivity" android:launchMode="singleTask">
<intent-filter>
<data android:scheme="#string/deep_linking_scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<data android:scheme="#string/universal_deep_linking_scheme_1" />
<data android:host="#string/universal_deep_linking_host_1" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<data android:scheme="#string/universal_deep_linking_scheme_2" />
<data android:host="#string/universal_deep_linking_host_1" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<meta-data android:name="LOCALYTICS_APP_KEY" android:value="#string/localytics_app_key" />
<receiver android:name="com.localytics.android.ReferralReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<activity android:name="com.localytics.android.PushTrackingActivity" />
<receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:permission="com.google.android.c2dm.permission.SEND" android:exported="true">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.xfinity.cloudtvr" />
</intent-filter>
</receiver>
<service android:name="com.localytics.android.GcmListenerService" android:exported="false">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service android:name="com.localytics.android.InstanceIDListenerService" android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID" />
</intent-filter>
</service>
<service android:name="com.xfinity.common.analytics.LocalyticsCrashReportingIntentService" android:exported="false" />
<activity android:name="com.xfinity.common.view.LaunchActivity" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:theme="0x7f0c0200" android:label="" android:name="com.xfinity.cloudtvr.view.authentication.EligibilityCheckActivity" android:launchMode="singleTop" android:windowSoftInputMode="10" />
<activity android:name="com.comcast.cim.android.view.settings.SignoutActivity" android:noHistory="true" />
<activity android:theme="0x7f0c010e" android:label="" android:name="com.xfinity.cloudtvr.view.PlayerActivity" android:launchMode="singleTop" android:configChanges="orientation|screenSize" android:windowSoftInputMode="20" android:parentActivityName="com.xfinity.cloudtvr.view.BrowseActivity">
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".view.BrowseActivity" />
</activity>
<activity android:theme="0x7f0c0203" android:label="#string/settings" android:name="com.xfinity.cloudtvr.view.settings.XtvSettingsActivity" />
<receiver android:name="com.xfinity.cloudtvr.inhome.ConnectionChangedBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service android:name="com.xfinity.cloudtvr.downloads.XtvDownloadService" android:exported="false" />
<service android:name="com.xfinity.cloudtvr.downloads.XtvDownloadsNotificationReceiver$XtvNotificationBuilderService" android:exported="false" />
<service android:name="com.xfinity.cloudtvr.model.resumepoint.ResumePointSyncIntentService" android:exported="false" />
<service android:name="com.xfinity.cloudtvr.model.user.parentalcontrols.ParentalControlsSyncIntentService" android:exported="false" />
<service android:name="com.xfinity.cloudtvr.downloads.DownloadUpdateService" android:exported="false" />
<service android:name="com.xfinity.cloudtvr.downloads.DownloadPermCacheReloadService" android:exported="false" />
<activity android:name="com.xfinity.cloudtvr.view.settings.SettingsWebViewActivity" />
<service android:name="com.xfinity.common.user.FavoritesSyncIntentService" />
<activity android:theme="#*android:style/Theme.Translucent" android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
<activity android:theme="#style/Theme_IAPTheme" android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" />
<activity android:theme="#*android:style/Theme.Translucent.NoTitleBar" android:name="com.google.android.gms.common.api.GoogleApiActivity" android:exported="false" />
<meta-data android:name="com.google.android.gms.version" android:value="#integer/google_play_services_version" />
</application>
</manifest>
I have been looking at this in notepad, so don't have the best view to look at all of the code and I am sort of new to Android coding and app development so I am just trying to see if anyone else who develops apps more in depth would know where to look and how to possibly fix the issue. I have tried installing Android System Webview and Google Chrome on the Fire TV stick without issues and that is what made the app work in its previous versions that have now since been retired.
Does anyone know where or what I could look for in the decompiled code or files that may impact/restrict the app when it is trying to start on the Fire TV Stick?
Here is the APK file version I am using: http://www.apkmirror.com/apk/comcast/xfinity-stream/xfinity-stream-4-2-1-001-release/xfinity-stream-4-2-1-001-android-apk-download/
I am sure this thread will be of much needed help for others as well because there are a bunch of people who have sideloaded this app and who are now experiencing this issue trying to get a new APK file up and running on the Fire TV Stick.

Enabling Deep Linking In Android App

I am trying to enable deep linking in my android app using this official guide.I am not able to understand where and how to add URI under data element. What would be the value of URI for my app. Is it referring to package name?Do I have to add intent filter tag for each android name activity? Any one example would be enough to make things clear. Please suggest.
My Manifest file :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp.praveen.healthcareit">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity android:name="com.myapp.praveen.healthcareit.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.myapp.praveen.healthcareit.EvlHealthPlans" />
<activity android:name="com.myapp.praveen.healthcareit.ConHealthInsurance" />
<activity android:name="com.myapp.praveen.healthcareit.HealthPlanNetworks" />
<activity android:name="com.myapp.praveen.healthcareit.ProvCompensation" />
<activity android:name="com.myapp.praveen.healthcareit.CdphpPlans" />
<activity android:name="com.myapp.praveen.healthcareit.HmoPlans" />
<activity android:name="com.myapp.praveen.healthcareit.PpoPlans" />
<activity android:name="com.myapp.praveen.healthcareit.ProviderTypes" />
<activity android:name="com.myapp.praveen.healthcareit.UtilizationManagement" />
<activity android:name="com.myapp.praveen.healthcareit.EDIConcept" />
<activity android:name="com.myapp.praveen.healthcareit.ClaimProcessing" />
<activity android:name="com.myapp.praveen.healthcareit.CobraHippa" />
<activity android:name="com.myapp.praveen.healthcareit.GovernmentPrograms"></activity>
</application>
</manifest>
No need filter to all activity need only for the activity which you want to invoke from deep link url. in manifest
<activity
android:name="yourpackagename"
android:screenOrientation="portrait"
android:label="#string/app_name"
android:theme="#style/actioncolor">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="schemename"
android:host="hostname" />
</intent-filter>
</activity>
your URI will be schemename://hostname?hereextraparametersifyouwant
here you get the full example with steps
https://codelabs.developers.google.com/codelabs/android-deep-linking/index.html?index=..%2F..%2Findex
Add following intent filter in the activity tag which you want to launch while deep linking.
<activity android:name="com.myapp.praveen.healthcareit.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="www.example.com"
android:pathPrefix="/appx"
android:scheme="http" />
</intent-filter>
</activity>
where your url is like http://www.example.com?appx=45. So here scheme is http or https. If you want both then add two intent filters, one with http and another with https. Then pathPrefix is the url parameters you want to identify. Not pathprefix can be empty or *. And finally host is your website address to be deep linked.

Custom scheme doesn't seem to launch in the app intent

I'm trying to create an Android app that needs to use OAuth to authenticate (with the Google Wave data API)
I've specified a custom scheme in my AndroidManifest.xml so that any views to a url beginning "braindump://" should go to my app:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.enigmagen.braindump"
android:versionName="0.1"
android:versionCode="1">
<uses-sdk android:minSdkVersion="7"></uses-sdk>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:icon="#drawable/icon"
android:label="#string/app_name"
android:debuggable="true">
<activity
android:name=".BrainDump"
android:label="#string/app_name"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="braindump" />
</intent-filter>
</activity>
</application>
</manifest>
All that happens though is that after the redirect, the browser address shows the correct URL, but the page content is
You do not have permission to open this page.
braindump://rest_of_address_here
Is there a specific permission that needs to be set to allow this sort of behaviour?
I had the exact same problem (OAuth) and this is how I fixed it.
I've separated my Main from the class that will act on the URI.
Here's how the AndroidManifest.xml should look like:
<?xml version="1.0" encoding="utf-8"?>
[snip]
<activity android:label="#string/app_name" android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="#string/app_name" android:name="OAUTHActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myscheme" android:host="oauth" />
</intent-filter>
</activity>
</application>
[/snip]
And I was able to open URIs like myscheme//oauth?oauth_verifier=xxx&oauth_token=yyy
Actually, it's possible to do it with only one activity, just creating one more intent filter. Like this:
<activity android:name=".MyActivity"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="my_scheme" android:host="my_app_host.com" />
</intent-filter>
</activity>
I don't think this is exactly the cause of your problem, but I got this same error "You do not have permission to open this page" and it was because I was using a scheme with a capital letter. eg "Celly" instead of "celly". This worked fine in the emulator but failed on real devices. Changing it all to lowercase fixed it.
According to the common tasks that should be:
<scheme android:name="braindump" />

Categories

Resources