5

I need to pass data from the below class to my flutter app where the data is only available when an incoming call event happens. i need to pass this data(mobileNumber) to flutter (if possible i need to pass data even the flutter app is terminated)

BroadcastReciever.java

package com.ashbu.flutterappbackground;
...

public class MyBroadcastReceiver extends BroadcastReceiver {
    String phoneNumber;

        @Override
        public void onReceive(final Context context, Intent intent) {
            TelephonyManager telephony = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
            telephony.listen(new PhoneStateListener(){
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    super.onCallStateChanged(state, incomingNumber);
                    phoneNumber = incomingNumber;
                    Toast.makeText(context, "TeleDuce Customer "+ incomingNumber,
                Toast.LENGTH_LONG).show();
                }
            },PhoneStateListener.LISTEN_CALL_STATE);
        }


   public  String getData() {
    String number = null;
    if (phoneNumber != null) {
        number = phoneNumber;
    }else {
        number = "noData";
    }
    return number;
    }

} from the above code, i need to pass incomingNumber to flutter. if possible - Share the data even the app is closed.

MainActivity.java

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.dev/getNumber";

AlarmManager alarmManager;
PendingIntent pendingIntent;

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent alarmIntent = new Intent(this, MyService.class);
    pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler(
                    (call, result) -> {

                        // Note: this method is invoked on the main thread.
                        if (call.method.equals("getMobileNumber")) {
                            startAlarm();
                            MyBroadcastReceiver dataGEt = new MyBroadcastReceiver();
                            System.out.println(dataGEt.getData());
                            result.success(dataGEt.getData());
                        } else {
                            cancelAlarm();
                        }
                    }
            );
}

private void startAlarm() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    }
}

private void cancelAlarm() {
    alarmManager.cancel(pendingIntent);
    Toast.makeText(getApplicationContext(), "Alarm Cancelled", Toast.LENGTH_LONG).show();
}
}

Currently the above code will work even the app is terminated. But i don't know if the flutter will accept the data after the app is terminated

2 Answers 2

2

You should be implement methodHandler in Flutterside and you should be make static object of methodchannel

For Example

class MethodChannelHelper {
  static const MethodChannel channel = const MethodChannel('method_channal_name');
}
class MethodChannelCall{
        static initMethodChannel({Function onCallBack}) async {
            MethodChannelHelper.channel.setMethodCallHandler((MethodCall call) async {
              switch (call.method) {
                case 'callback_from_native':
                  print("This method will be called when native fire")
              }
            });
     await MethodChannelHelper.channel.invokeMethod('call_native');
          }
}

In main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await MethodChannelCall.initMethodChannel(onCallBack: (payload) {

  });
  runApp(MyApp());
}

Now In Android side

 override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
 when (call.method) {
            "call_native" -> {
            methodChannel?.invokeMethod("callback_from_native","")

}
}
Sign up to request clarification or add additional context in comments.

5 Comments

Do i want to use alarmManager plugin to do this? Will it work in background
If you want to fire broadcast on particular time then user Alarm
Sorry..what??.... I didn't get you... what is that alarmManager in the main.dart
can you pls explain it..Where did that AlarmManager come from
0

I passed the list as the argument from main.dart to MainActivity.kt class

in main.dart

var  items =['hello', 'hii', 'flowers', 'roses','loutes']; 
 Future<void> _getDeviceInfo() async {
    String result;
    try {
      platform.invokeMethod('getDeviceInfo' , items).then((items) {
        result = items.toString();
        setState(() {
          deviceInfo = result;
        });
      });
    } on PlatformException catch (e) {
      print("_getDeviceInfo==>${e.message}");
    }
  }

In MainActivity.kt class

package com.example.flutter_to_native


import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example.flutter/device_info" // Unique Channel


    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            // Note: this method is invoked on the main thread.
                call, result ->
            if (call.method == "getDeviceInfo") {
                val data = call.arguments
                Log.d("data1", "$data")
                val intent = Intent(this, DemoActivity::class.java)
                intent.putExtra("data",data.toString())
                startActivity(intent)

              else {
                result.notImplemented()
            }

        }
    }


    
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.