Android - browser and download notification - java

If I use "intent" to download a file with Android browser like that:
Intent downloadIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://myserver.com/picture1.jpg"));
startActivity(downloadIntent);
Can I catch some event when the browser finish the download?

No, you will have to implement your own WebView. Once you have done so, you must set a WebViewClient and overwrite the onPageFinished method.

Related

Detect URL open

I have an android app where in some places it may have the URLs (e.g. from push notifications, in some views where text is pulled from BE, etc.). My question is: is there any fast and good way to detect that app opens up a URL and redirect it to the web browser? I want to check the opened URL and in some cases stop app from opening web browser and do my custom action instead. Thanks
Not directly. If you are using Intent Action view and passing like this
ContextCompat.startActivity(
context,
Intent(Intent.ACTION_VIEW, Uri.parse(appLink)),
null
)
You could use a broadcast manager sent it there and from on onReceive method you can call the code to launch web browser from broadcast.
You could perhaps use a WebView and intercept all request calls using this code
mWebView?.setWebViewClient(object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
LogUtils.d(request?.url)
return super.shouldInterceptRequest(view, request)
}
})

Open another application's activity in the Same Task?

For example, when I open Facebook Login page from an application that screen (activity) is loaded in the same Task stack.
In the same way, I want to open an activity of another application from my application, to be loaded in the same Task Stack, not starting New Task.
Normally, when we access other application we use "FLAG_ACTIVITY_NEW_TASK", which creates new task.
But How do I load the other application's activity in the same Task ?
Targeted new application is not android built-in Intent activities (like email, contact, call etc.)
I am trying to open activity of my another application from one application.
UPDATE
I think I couldnt make it enough clear. I have application A and Application B installed in device, both apps made by me, not system built. Now I want to access main_activity of Application B from an activity of application A, and still remain in the same Task. Thanks
But How do I load the other application's activity in the same Task ?
First, do not use FLAG_ACTIVITY_NEW_TASK. This says that you do not want a new task.
Second, ensure that the activity that you are starting does not have a taskAffinity or launchMode that would interfere with this.
So, for example, startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS)); will start the date-and-time Settings screen in your task. Most Settings screens have a taskAffinity, where this would still wind up in a separate task.
for inbulit mail application :
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL , new String[]{"test#gmail.com"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT , "Content");
try {
startActivity(Intent.createChooser(intent, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MyActivity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}

Android: How to close application opened from my app when all sent to background

Here is my problem. I am developing app that loads some documents from server. I open document in another app via Intent.ACTION_VIEW. This is all working just fine. Problem is that whole app is pin protected so I have to capture events such "sent to background" or "screen lock" to bring up pin screen afterwards and this is not working when another app is opened above mine. So if user opens document then press home button, click on my launch icon from menu then he gets again external app with opened document and with back button access my app again. This is security issue that needs to be fixed.
Here are some code snippets:
Opening document:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(downloadedFile);
String mimeType = document.getMimeType();
intent.setDataAndType(uri, mimeType);
startActivityForResult(intent, 1);
capture sent to background:
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
IN_BACKGROUND = true;
Log.i(PinUtil.class.getSimpleName(), "App sent to background ");
} else {
IN_BACKGROUND = false;
}
}
My question is: Is it possible to detect if my app is sent to background when another app is opened? How not to open another app when my launcher icon is pressed.
Thanks for all responses.
Regards
Lubos
In order to fix this problem:
So if user opens document then press home button, click on my launch
icon from menu then he gets again external app with opened document
and with back button access my app again. This is security issue that
needs to be fixed. Here are some code snippets:
You need to make sure that, when you launch an external app for the user to view a document, that the external app does not run in the same task as your application. It needs to run in a new, separate task. You can do this like this:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Ensure app runs in separate task
Uri uri = Uri.fromFile(downloadedFile);
String mimeType = document.getMimeType();
intent.setDataAndType(uri, mimeType);
startActivity(intent); // Can't use startActivityForResult() here
However, you can't use startActivityForResult() when you launch the external viewer, because an activity running in another task cannot return a result to you. However, most external applications won't return a result when launched with ACTION_VIEW anyway, so it probably isn't a problem.
Then you asked this:
My question is: Is it possible to detect if my app is sent to
background when another app is opened? How not to open another app
when my launcher icon is pressed.
There should be some answers on StackOverflow that can help you determine if your application is in the background (it isn't actually that easy to determine this).
My explanation above should answer your 2nd question. If you don't launch other apps in your task, then only your app will be launched when your launcher icon is pressed.

Trying to use Zxing QR code reader API results in force close

I have integrated the Zxing API and use this code:
Intent data = new Intent("com.google.zxing.client.android.SCAN");
And getting the result with this code:
String contents = data.getStringExtra("SCAN_RESULT");
String format = data.getStringExtra("SCAN_RESULT_FORMAT");
But when I run this code, the app will ask to force close.
When sending an Intent to startActivity(), you must always check if the user has any apps that can handle the intent:
Caution: It's possible that a user won't have any apps that handle the implicit intent you send to startActivity(). If that happens, the call will fail and your app will crash. To verify that an activity will receive the intent, call resolveActivity() on your Intent object. If the result is non-null, then there is at least one app that can handle the intent and it's safe to call startActivity(). If the result is null, you should not use the intent and, if possible, you should disable the feature that issues the intent.
Go through this. App is crashing because Zxing app is not installed in the mobile. I gave a detailed answer in the same link.

Android open browser from service avoiding multiple tabs

I am trying to open the browser window from my service with a link that opens in the current tab of the browser. when I use
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.google.com"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
If the browser was opened and in the foreground before my service starts the intent and the browser opens the link in the same window/tab. If the Browser was minimized and the service starts the intent, the browser opens the webpage in a new window/tab.
I cannot use a web-view as it needs to be in the web browser and it will only be dealing with the default browser. I have checked out the thread at Open an url in android browser, avoid multiple tabs but it did not have an answer. I also have tried force closing the browser but that is also does not work.
Thank you for any help!
If you want to use your app to fire that intent .. so call your app directly through package name
check the following code:
Intent in = getPackageManager().getLaunchIntentForPackage("com.package.myappweb");
in.putExtra("myURL","http://www.google.com");
in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity( in );
you can pass the URL through intent and get it in your app by:
String url=getIntent().getStringExtra("myURL");
if(url!=null){
/// launch app and use one tab for showing the webpage
}else{
//launch app normally.
}
the code you mentioned used for using app as web-app ..that will show popup window to use to pick up any browser to deal with the link .. not that would be for any app wanna open link
good luck,
The way to avoid multiple tabs is as follows:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName());
startActivity(intent);
The EXTRA_APPLICATION_ID will contain an ID of your app, and the browser will recycle a tab that was opened by your application, rather than opening a new tab. In this way, all the pages opened by your application will share the same tab, and you will not have "tab inflation" in the browser.
None of the solutions above involving Browser.EXTRA_APPLICATION_ID work.
However, Google's Custom Tabs which is now the standard for opening URL's was easy to implement and works like a charm. Here's all you need to open a tab:
implementation "androidx.browser:browser:1.4.0"
String url = "https://google.com/";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));
More can be found here.

Categories