首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cordova插件在android中识别来电号码?

Cordova插件在android中识别来电号码?
EN

Stack Overflow用户
提问于 2017-09-08 20:29:20
回答 1查看 500关注 0票数 1

我正在尝试从我的cordova android插件中获取来电号码。能够使用TELEPHONYMANGER.PHONE_STATE_CHANGED获取电话状态。但无法获取来电号码。BroadcastReceiver的Intent提供了获取来电号码的选项。但是BroadcastReceiver的onReceive函数不会被触发。请帮帮忙。

代码语言:javascript
运行
复制
package io.infonion.calldetail;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import android.support.v4.content.LocalBroadcastManager;
import org.apache.cordova.PluginResult;
import android.content.Context;
import android.widget.Toast;
import android.telephony.PhoneStateListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.TelephonyManager;
import android.content.BroadcastReceiver;
import android.os.Bundle;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONArray;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class CallDetail extends CordovaPlugin {
    CallStateListener listener;
    IntentFilter intentFilter;
    Context maincontext;
        public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
            Toast.makeText(cordova.getActivity().getApplicationContext(), "first", Toast.LENGTH_LONG).show();
            if (listener == null) {
                listener = new CallStateListener();
                listener.setCordovaContext(cordova.getActivity().getApplicationContext());
                listener.setCallbackContext(callbackContext);
                Toast.makeText(cordova.getActivity().getApplicationContext(), "fourth", Toast.LENGTH_LONG).show();
                intentFilter = new IntentFilter() ;
                intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
                LocalBroadcastManager.getInstance(super.webView.getContext()).registerReceiver(listener,intentFilter);
                //registerReceiver(listener, intentFilter);
                Toast.makeText(cordova.getActivity().getApplicationContext(), "fifth", Toast.LENGTH_LONG).show();
            }
            return true;
        }




    }
     class CallStateListener extends BroadcastReceiver {

        private CallbackContext callbackContext;
       private Context cordovaContext;

            public void setCallbackContext(CallbackContext callbackContext) {
                Toast.makeText(cordovaContext, "third", Toast.LENGTH_LONG).show();
                this.callbackContext = callbackContext;                
            }

            public void setCordovaContext(Context cordovaContext) {
                Toast.makeText(cordovaContext, "second", Toast.LENGTH_LONG).show();
                this.cordovaContext = cordovaContext;                
            }




            @Override
            public void onReceive(final Context context, Intent intent) {
                String act=intent.getAction();
                String number="";
                Toast.makeText(cordovaContext, "Sixth", Toast.LENGTH_LONG).show();

                if(intent.getAction().equals("TelephonyManager.ACTION_PHONE_STATE_CHANGED")){

                    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                    Toast.makeText(cordovaContext, state, Toast.LENGTH_LONG).show();
                    if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                        //  Log.d(TAG, "Inside Extra state off hook");
                     number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                        Toast.makeText(cordovaContext, "EXTRA_STATE_OFFHOOK", Toast.LENGTH_LONG).show();
                        //   Log.e(TAG, "outgoing number : " + number);              
                    }       

                    else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){   
                        //   Log.e(TAG, "Inside EXTRA_STATE_RINGING");
                         number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                        Toast.makeText(cordovaContext, "RINGING", Toast.LENGTH_LONG).show();
                        //   Log.e(TAG, "incoming number : " + number);
                    }
                    else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                        Toast.makeText(cordovaContext, "EXTRA_STATE_IDLE", Toast.LENGTH_LONG).show();
                        //  Log.d(TAG, "Inside EXTRA_STATE_IDLE");
                    }   

                    PluginResult result = new PluginResult(PluginResult.Status.OK, number);
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                } 





            }
        }
EN

回答 1

Stack Overflow用户

发布于 2018-08-09 17:28:40

也许现在回答已经晚了,但希望这能帮助其他人:为接收方创建实例"new CallStateListener()“不会触发onReceive方法。您的接收器不工作,应该在tag 应用程序内的AndroidManifest.xml处声明它。

因此,您应该首先使static成为类CallStateListener:

代码语言:javascript
运行
复制
public static CallStateListener extends BrodcastReceiver {}

并在您的plugin.xml文件中添加以下行:

代码语言:javascript
运行
复制
<config-file target="AndroidManifest.xml" parent="/manifest/application">

        <receiver android:name="io.infonion.calldetail.CallDetail$CallStateListener"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
        </receiver>
</config-file>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46116621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档