Android: Intent#getExtras() is always null, nothing helps - android

When I create a new Intent in an Activity:
Intent myIntent = new Intent(this, TargetActivity.class);
// apply hacks explained in above stackoverflow answers
System.out.println(myIntent.getExtras())
(this code lays in a default blank activity)
Intent#getExtras() is always null and thus Intent#putExtras(...) leads to immediate NullPointerException. Starting the Intent, however, works without any problems.
I've read all similar stackoverflow posts about this topic:
https://stackoverflow.com/a/6357330
https://stackoverflow.com/a/14288868
https://stackoverflow.com/a/16458878
https://stackoverflow.com/a/16377139
https://stackoverflow.com/a/13596581
https://stackoverflow.com/a/24047080
https://stackoverflow.com/a/3128271
I've tried them all, but none of them seems to have any effect.
Could anyone please provide a solution to simply start an Intent with non-null extras which always works?
Alternatively, is there any other way to provide extra information to an Intent which is clean and not leaky?

OK, I found the problem. Thank you #DanielNugent for pointing to the canonical answer to Intent handling.
The problem was: when I did
myIntent .putExtra("myVar", myVar);
myVar was null!
Stupid of me I didn't double check that and panic, put somehow stupid of Android that this does indeed lead to immediate NullPointerException! Please try it yourself if you don't believe me.
#njzk2: Thank you, I didn't realize that.

Related

Method that uses Intent

OK, so I'm not sure how to explain this, but basically what I want to do is when a web/ URL request is passed in a android phone, I want to find out how to get the Intent of that request/action.
For example, when I do this:
MS.FUNCTION("android.content.Intent", new MS.FUNCTION() {
public void classLoaded(Class<?> content) {
Method **SOMETHING**;
try {
open = intent.getMethod("open", Integer.TYPE);
} catch (NoSuchMethodException d)
I want a method (in place of SOMETHING) that passes/uses an Intent when executed, so then I can get extra information. At this point, it is just for web/URL Intents
Thanks so much for any help, and sorry for the probable confusion. I would be glad to answer any other questions regarding clarification.
Also, I have been to the android Intent website, and I have not found what I am looking for. However, this could very easily just be my searching skills.

Why I am Getting Error 'Channel is unrecoverably broken and will be disposed!'

When I try to launch my AndEngine Activity, I get this error:
ERROR/InputDispatcher(21374): channel '4122e148 my.package.AcGame (server)' ~ Channel is unrecoverably broken and will be disposed!
The app doesn't crash, but there's a black screen and the device doesn't react to pressing the 'back' or 'home' buttons.
Does anyone know what the problem is?
One of the most common reasons I see that error is when I am trying to display an alert dialog or progress dialog in an activity that is not in the foreground. Like when a background thread that displays a dialog box is running in a paused activity.
I think that You have memory leaks somewhere. You can find tips to avoid leaking memory here. Also you can learn about tools to track it down here.
Have you used another UI thread? You shouldn't use more than 1 UI thread and make it look like a sandwich. Doing this will cause memory leaks.
I have solved a similar issue 2 days ago...
To keep things short: The main thread can have many UI threads to do multiple works, but if one sub-thread containing a UI thread is inside it, The UI thread may not have finished its work yet while it's parent thread has already finished its work, this causes memory leaks.
For example...for Fragment & UI application...this will cause memory leaks.
getActivity().runOnUiThread(new Runnable(){
public void run() {//No.1
ShowDataScreen();
getActivity().runOnUiThread(new Runnable(){
public void run() {//No.2
Toast.makeText(getActivity(), "This is error way",Toast.LENGTH_SHORT).show();
}});// end of No.2 UI new thread
}});// end of No.1 UI new thread
My solution is rearrange as below:
getActivity().runOnUiThread(new Runnable(){
public void run() {//No.1
ShowDataScreen();
}});// end of No.1 UI new thread
getActivity().runOnUiThread(new Runnable(){
public void run() {//No.2
Toast.makeText(getActivity(), "This is correct way",Toast.LENGTH_SHORT).show();
}});// end of No.2 UI new thread
for you reference.
I am Taiwanese, I am glad to answer here once more.
You can see the source code about this output here:
void InputDispatcher::onDispatchCycleBrokenLocked(
nsecs_t currentTime, const sp<Connection>& connection) {
ALOGE("channel '%s' ~ Channel is unrecoverably broken and will be disposed!",
connection->getInputChannelName());
CommandEntry* commandEntry = postCommandLocked(
& InputDispatcher::doNotifyInputChannelBrokenLockedInterruptible);
commandEntry->connection = connection;
}
It's cause by cycle broken locked...
I got similar error (my app crashes) after I renamed something in strings.xml and forgot to modify other files (a preference xml resource file and java code).
IDE (android studio) didn't showed any errors. But, after I repaired my xml files and java code, app ran okay. So, maybe there are some small mistakes in your xml files or constants.
I had the same problem.
To solve the error:
Close it on the emulator and then run it using Android Studio.
The error happens when you try to re-run the app when the app is already running on the emulator.
Basically the error says - "I don't have the existing channel anymore and disposing the already established connection" as you have run the app from Android Studio again.
I had the same problem but mine was Due To an Android database memory leak. I skipped a cursor. So the device crashes so as to fix that memory leak. If you are working with the Android database check if you skipped a cursor while retrieving from the database
I had the same problem. Mine was due to a third jar, but the logcat did not catch the exception, i solved by update the third jar, hope these will help.
As I faced this error, somewhere in your code your funcs or libraries that used run on different threads, so try to call all code on the same thread , it fixed my problem.
If you call methods on WebView from any thread other than your app's UI thread, it can cause unexpected results. For example, if your app uses multiple threads, you can use the runOnUiThread() method to ensure your code executes on the UI thread:
Google reference link
It's obvious this creeps up due to many issues.
For me, I was posting several OneTimeWorkRequest, each accessing a single room database, and inserting into a single table.
Making the DAO functions suspended, and calling them within the coroutine scope of the worker fixed this for me.
It happened for me as well while running a game using and-engine.
It was fixed after i added the below code to my manifest.xml. This code should be added to your mainactivity.
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|mcc|mnc"
Reading through all contributions, it looks like many different origins exhibit cause this same problem symptoms.
In my case for instance - I got this problem as soon as I added
android:progressBackgroundTintMode="src_over"
to my progress bar properties.
I think the GUI designer of ADT is known for several bugs. Hence I assume this is one of them. So if you encounter similar problem symptoms (that just do not make sense) after playing with your GUI setup, just try to roll back what you did and undo your last GUI modifications.
Just press Ctrl+z with the recently modified file on screen.
Or:
The Version Control tool could be helpful. Open the Version Control panel - choose Local Changes tab and see recently modified (perhaps .xml) files.
Right click some most suspicious one and click Show Diff.
Then just guess which modified line could be responsible.
Good luck :)
I was having the same problem too. In my case was caused when trying to reproduce videos with a poor codification (demanded too much memory).
This helped me to catch the error and request another version of the same video.
https://stackoverflow.com/a/11986400/2508527
In my case these two issue occurs in some cases like when I am trying to display the progress dialog in an activity that is not in the foreground. So, I dismiss the progress dialog in onPause of the activity lifecycle. And the issue is resolved.
Cannot start this animator on a detached view! reveal effect BUG
ANSWER: Cannot start this animator on a detached view! reveal effect
Why I am Getting Error 'Channel is unrecoverably broken and will be disposed!
ANSWER: Why I am Getting Error 'Channel is unrecoverably broken and will be disposed!'
#Override
protected void onPause() {
super.onPause();
dismissProgressDialog();
}
private void dismissProgressDialog() {
if(progressDialog != null && progressDialog.isShowing())
progressDialog.dismiss();
}
I had this issue and the cause was actually a NullPointerException. But it was not presented to me as one!
my Output:
screen was stuck for a very long period and ANR
My State :
the layout xml file was included another layout, but referenced the included view without giving id in the attached layout. (i had two more similar implementations of the same child view, so the resource id was created with the given name)
Note : it was a Custom Dialog layout, so checking dialogs first may help a bit
Conclusion :
There is some memory leak happened on searching the id of the child view.
This error occurred in case of memory leak. For example if you have any static context of an Android component (Activity/service/etc) and its gets killed by system.
Example: Music player controls in notification area. Use a foreground service and set actions in the notification channel via PendingIntent like below.
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setAction(AppConstants.ACTION.MAIN_ACTION);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Intent previousIntent = new Intent(this, ForegroundService.class);
previousIntent.setAction(AppConstants.ACTION.PREV_ACTION);
PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
previousIntent, 0);
Intent playIntent = new Intent(this, ForegroundService.class);
playIntent.setAction(AppConstants.ACTION.PLAY_ACTION);
PendingIntent pplayIntent = PendingIntent.getService(this, 0,
playIntent, 0);
Intent nextIntent = new Intent(this, ForegroundService.class);
nextIntent.setAction(AppConstants.ACTION.NEXT_ACTION);
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_HIGH);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder
.setOngoing(true)
.setAutoCancel(true)
.setWhen(System.currentTimeMillis())
.setContentTitle("Foreground Service")
.setContentText("Foreground Service Running")
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
.setContentIntent(pendingIntent)
.setPriority(NotificationManager.IMPORTANCE_MAX)
.setCategory(Notification.CATEGORY_SERVICE)
.setTicker("Hearty365")
.build();
startForeground(AppConstants.NOTIFICATION_ID.FOREGROUND_SERVICE,
notification);
And if this notification channel get broken abruptly (may be by system, like in Xiomi devices when we clean out the background apps), then due to memory leaks this error is thrown by system.
For me it was caused by a splash screen image that was too big (over 4000x2000). The problem disappeared after reducing its dimensions.
Just Try to Invalidate the IDE cached and restart. This wont fix the issue. But in my case doing this revealed the possible crash
Please check you Realm entity class.
If you declare variable as lateinit var and
you try to check that uninitialized variable check with isNullOrEmpty() return "Channel is unrecoverably broken and will be disposed!"
In my case I was setting value in background thread viewModelScope.launch(Dispatchers.IO) { } so app was crashing solution in my case I was removed (Dispatchers.IO). viewModelScope.launch{ }
In my case, I was using Glide library and the image passed to it was null. So it was throwing this error. I put a check like this:
if (imageData != null) {
// add value in View here
}
And it worked fine. Hope this helps someone.
I got same logcat message, just realize that string.xml value of array cannot be number/digit, but only text/alphabet is allowed.
In my case
this error is happening because of not connected to firebase firestore but using the same.
To rectify the issue please go to Tools-> Firebase
when a window will open on RHS choose the options to
-> Connect your app to Firebase
-> Add Cloud Firestore to your app
Check your ViewModel class and not finding any issue then try to comment code where you using launch or withContext.
In my case, I commented on code where I am using launch or withContext and it worked my app is running normally.
I had a kind of issue you described. In my case it happened only in release builds. It was caused by the obfuscation: native methods crashed silently on FindClass or GetMethodID call cuz the names were obfuscated. Editing proguard-rules worked out!
The issue for me was I havent defined the instance of an Activity.
Eg:
Myclass my;
onCreate() {
my.getData();
}
Instead of:
Myclass my;
onCreate() {
my = new Myclass();
my.getData();
}
This is weird as Studio has to give some good defining error message.
Just to add to many other answers:
My app crashed without anything relevant in LogCat. My Retrofit network call that caused the crash looked like this:
CoroutineScope(Dispatchers.IO).launch {
val response = api.getData()
}
and used the following method signature
suspend fun getData() : Response<RatesResponse>
I changed it removing Response from the return type & got it working 🀷
suspend fun getData() : RatesResponse
There are two ways this can be resolved,
Try removing the Dispatchers.XXX from the launch
viewModelScope.launch(Dispatchers.IO) { }
viewModelScope.launch{ }
Add CoroutineExceptionHandler to catch the exception, this will tell you what exactly is going wrong.
val handler = CoroutineExceptionHandler { coroutineContext, throwable ->
Log.d("TAG","EROR ${throwable.message}")
}
lifecycleScope.launch(handler) { }
When it happened to me:
Forgot to delete TODO().
SQL query result with a null field getting assigned to a non null data class's field.

Android How to make a call that includes "#" or "p" in the dial?

I need to make calls in my Android app that includes "#" or "p" in the dial.
If I use the next code:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:629941945#22412"));
startActivity(intent);
It makes the call to the number 629941945 without the # and 22412.
And if I use the next code:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:629941945p22412"));
startActivity(intent);
It makes the call without the "p": 62994194522412.
There is a form that I can solve it?
Intent shortcutIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+Uri.encode("*111*2#")));
startActivity(shortcutIntent);
Try tel:629941945%2322412 instead of tel:629941945#22412
%23 will be replaced with #
Try to use others symbol for pause. Look at http://androidforums.com/android-applications/6733-how-do-i-dial-extension.html or http://code.google.com/p/android/issues/detail?id=7514
But! As I see threre are not one solution and this is depends of phone model
Pause is not supported in the tel URI spec.
http://www.ietf.org/rfc/rfc3966.txt
As stated in another answer %23 can be used to substitute for #.
Some phones don’t have β€œp” character, but β€œ,” (comma), somewhere it is
β€œT” and if your phone does not have these fancy characters available,
try β€œ*” or β€œ#β€œ. Hopefully one of this characters will work. Beware, on
some phones are letters case sensitive, so P can not work.
http://rekrowten.wordpress.com/2011/08/29/special-characters-in-telephone-number/
You can not parse such special numbers with an URI since these are not compliant to tel: standard. (http://www.ietf.org/rfc/rfc3966.txt Page 6ff)
You might want to use ACTION_DIAL and give the user the possibility to enter the number himself. Maybe then the phone interprets this as the pause signal p is intended for. To send such pause signals, check Alex Klimashevsky's answer.
Try using "," (comma) instead of p. No idea about "#" though, sorry.

Call APNDroid from my app

I am trying to write an app that calls APNDroid for enabling/disabling the 3G.
I looked at the code snippets provided by the developer.
I can't seem to understand how to incorporate them in my code.
Here is the code snippet I am referring to:
boolean targetState = getCheckBoxState(R.id.target_state);
boolean keepMms = getCheckBoxState(R.id.keep_mms);
boolean showNotification = getCheckBoxState(R.id.show_notification);
Intent intent = new Intent(ApplicationConstants.CHANGE_STATUS_REQUEST);
int onState = ApplicationConstants.State.ON;
int offState = ApplicationConstants.State.OFF;
intent.putExtra(ApplicationConstants.TARGET_MMS_STATE, keepMms ? onState : offState);
intent.putExtra(ApplicationConstants.TARGET_APN_STATE, targetState ? onState : offState);
intent.putExtra(ApplicationConstants.SHOW_NOTIFICATION, showNotification);
MyActivity.this.startActivityForResult(intent, CHANGE_REQUEST);
Specifically, I do not understand how this code knows to call an APNDroid activity.
The constants are found here
Obviously none of this is recognized by "eclipse" when I embed it in my code.
Should I import something?
Should I somehow give a reference to the APNDroid app?
Any help will be much appreciated.
Thank you.
Avi
You first have to checkout the project. Following these steps
You also have in that piece of code the name of the Intent to call. Have a look here to see how to call the intent of another applications in Android
Call or start external Application Android

How to handle ERROR_RECOGNIZER_BUSY

In my voice recognition based app, I sometimes receive ERROR_RECOGNIZER_BUSY. Intuitively, this calls for... retries, right?
The problem is that this error is very undocumented, so obviously I have questions that perhaps someone more experienced in the field is able to answer:
What triggers such an error? Is it
really only busy server (at Google)?
or this could also hint at a bug in my app?
Do I have to explicitly close/reopen
a session before a retry?
How often to retry? once every
1-second? every 5-seconds? Other?
Your experienced insights are most welcome. Thanks.
I'm not 100% sure of this, however since it's been so long since you posted, I may as well give it a shot.
It seems that you are doing something wrong in the code. As the commenter said, it would be helpful if you actually posted the code that is returning this error.
However, in the source code for the Android speech recognition service found here:
http://source-android.frandroid.com/frameworks/base/core/java/android/speech/RecognitionService.java
we have a function called dispatchStopListening which seems to end the listening process. However, before it actually ends it, there are a few checks for illegal states, including this:
else if (mCurrentCallback.mListener.asBinder() != listener.asBinder()) {
listener.onError(SpeechRecognizer.ERROR_RECOGNIZER_BUSY);
Log.w(TAG, "stopListening called by other caller than startListening - ignoring");
}
This seems to imply that you are trying to end the listening process by some other guy than you started it with, which raises this error.
I hope this helps, but it would be extremely beneficial if you posted the code.
ERROR_RECOGNIZER_BUSY is often thrown when you are already in use of the SpeechRecognizer object. (Or you didn't close one proprely).
Simply add the package to your recognizer intent and it should work. That is what I have done.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
...
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.package.name");
The most likely cause for ERROR_RECOGNIZER_BUSY is that you have not stopped the recognition service from the main thread and the error thrown was ignored.
This actually is a very simple error. It means the previous listening is not finished. Basically, you need to stop listening. In my App i have 2 button for different languages. calling stopListening() fixed the issue. The error does appear from time to time but the user experience is smooth now. It doesn't cause problems.
speech.stopListening();
USER_ID = 2;
Intent recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, TARGET_CODE);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, TARGET_CODE);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, Conversation.this.getPackageName());
speech.startListening(recognizerIntent);

Categories

Resources