Java 在Android中以编程方式拨打多个号码?
我正在尝试为一个应用开发一个功能,我可以一个接一个地自动拨打多个号码。通过点击按钮,将生成一个电话号码,如果该电话有人接听,则中断该流程 如果所拨号码无法连接呼叫(由于以下任何原因): 拨的号码占线。 所拨号码已关闭。 所拨打的号码位于覆盖范围之外的区域…等)。 那么,如何通过检查呼叫状态自动将呼叫重定向到另一个号码Java 在Android中以编程方式拨打多个号码?,java,android,Java,Android,我正在尝试为一个应用开发一个功能,我可以一个接一个地自动拨打多个号码。通过点击按钮,将生成一个电话号码,如果该电话有人接听,则中断该流程 如果所拨号码无法连接呼叫(由于以下任何原因): 拨的号码占线。 所拨号码已关闭。 所拨打的号码位于覆盖范围之外的区域…等)。 那么,如何通过检查呼叫状态自动将呼叫重定向到另一个号码 是否可以通过检查拨出电话的状态来自动一个接一个地呼叫多个号码,如何操作?将您的所有号码储存在一个数组中,然后浏览最后一个号码,如果您有N个号码,则代码java将为 for (i=0
是否可以通过检查拨出电话的状态来自动一个接一个地呼叫多个号码,如何操作?将您的所有号码储存在一个数组中,然后浏览最后一个号码,如果您有N个号码,则代码java将为
for (i=0,i<N,i++)
{test=this.call(A[i]);
if test==0 i=i+1;
else i=N;
}
for(i=0,i尝试执行while循环以浏览数字数组
while (i<=N)
{.....}
while(i问题通过使用广播接收机和
package bp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import model.NumberModel;
public class PhoneStateBroadcastReceiver extends BroadcastReceiver {
private final String TAG = getClass().getSimpleName() + "Atiar - ";
public boolean prevState = false, currentState = false;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
// Outgoing call
final String outgoingCallNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, outgoingCallNumber);
}
else {
// Incoming call
String incomingCallNumber = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i(TAG, incomingCallNumber+"");
}
try {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
Toast.makeText(context, "Ringing State", Toast.LENGTH_SHORT).show();
//BP.savePreviousState(false);
}
if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Toast.makeText(context, "Received State", Toast.LENGTH_SHORT).show();
BP.savePreviousState(true);
}
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
currentState=true;
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
Log.e(TAG, "Ideal state");
Toast.makeText(context, "Idle State", Toast.LENGTH_SHORT).show();
Log.e(TAG,"curr = " + currentState + " prev = "+BP.getPreviousState()+ " size ="+ BP.queue.size());
if (BP.getPreviousState() && currentState && BP.queue.size()>0){
BP.callNumberFromNumberDialActivity();
}
}
}, 3000);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
另一类具有静态方法和队列以及处理时延的handler
包bp
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.Locale;
import java.util.Queue;
import info.atiar.prnappdialer.NumberDialActivity;
public class BP {
private static final String PREFS_NAME = "pref";
public static Activity numberDialActivity;
public static Queue<String> queue = new LinkedList<>();
public static String getCurrentDateTime(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = sdf.format(new Date());
return currentDateandTime;
}
public static void openDialPad(Activity activity, String phoneNumber) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + phoneNumber));
activity.startActivity(intent);
}
public static void callNumber(Activity activity, String phoneNumber) {
numberDialActivity = activity;
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + phoneNumber));
activity.startActivity(intent);
}
public static void callNumberFromNumberDialActivity() {
callNumber(numberDialActivity,queue.remove());
}
public static void savePreviousState(Boolean previousState){
setPreference("prev",previousState);
}
public static boolean getPreviousState(){
return getPreference("prev");
}
//SharedPreferences
private static boolean setPreference(String key, boolean value) {
SharedPreferences settings = MyApplication.getContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(key, value);
return editor.commit();
}
private static boolean getPreference(String key) {
SharedPreferences settings = MyApplication.getContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
return settings.getBoolean(key, false);
}
private static void removeSingleItem(String keyToRemove) {
SharedPreferences settings = MyApplication.getContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
settings.edit().remove(keyToRemove).commit();
}
private static void removeAllItem() {
SharedPreferences settings = MyApplication.getContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
settings.edit().clear().commit();
}
}
导入android.Manifest;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.net.Uri;
导入com.karumi.dexter.dexter;
导入com.karumi.dexter.PermissionToken;
导入com.karumi.dexter.listener.PermissionDeniedResponse;
导入com.karumi.dexter.listener.PermissionGrantedResponse;
导入com.karumi.dexter.listener.PermissionRequest;
导入com.karumi.dexter.listener.single.PermissionListener;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.LinkedList;
导入java.util.Locale;
导入java.util.Queue;
导入info.atiar.prnappdialer.numberdial活动;
公共类BP{
私有静态最终字符串PREFS_NAME=“pref”;
公众静态活动次数;
public static Queue=new LinkedList();
公共静态字符串getCurrentDateTime(){
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMMdd_HHmmss”,Locale.getDefault());
字符串currentDateandTime=sdf.format(new Date());
返回当前日期和时间;
}
公共静态void openDialPad(活动活动、字符串电话号码){
意向意向=新意向(意向.行动拨号);
setData(Uri.parse(“tel:+phoneNumber”);
活动。开始触觉(意图);
}
公共静态void callNumber(活动活动、字符串phoneNumber){
NumberDiaActivity=活动;
意向意向=新意向(意向.行动\调用);
setData(Uri.parse(“tel:+phoneNumber”);
活动。开始触觉(意图);
}
public static void callnumberfromnumberdialivity()的调用号{
callNumber(numberdialivity,queue.remove());
}
公共静态void savePreviousState(布尔值previousState){
setPreference(“prev”,previousState);
}
公共静态布尔getPreviousState(){
返回优先权(“prev”);
}
//共享引用
私有静态布尔setPreference(字符串键、布尔值){
SharedReferences设置=MyApplication.getContext().GetSharedReferences(首选名称,上下文.MODE\u专用);
SharedReferences.Editor=settings.edit();
编辑器.putBoolean(键,值);
返回editor.commit();
}
私有静态布尔getPreference(字符串键){
SharedReferences设置=MyApplication.getContext().GetSharedReferences(首选名称,上下文.MODE\u专用);
返回设置.getBoolean(键,false);
}
私有静态void removeSingleItem(字符串键删除){
SharedReferences设置=MyApplication.getContext().GetSharedReferences(首选名称,上下文.MODE\u专用);
settings.edit().remove(keyToRemove.commit();
}
私有静态void removeAllItem(){
SharedReferences设置=MyApplication.getContext().GetSharedReferences(首选名称,上下文.MODE\u专用);
settings.edit().clear().commit();
}
}
我不是在寻找逻辑。我是在寻找情况,这是否可能是由android实现的?如果可能的话,那么如何管理这种情况。是的,这是可能的,只要想象一个应用程序,当你在android上使用手机应用程序时,它能做你要做的事情:打电话,检查号码是否可用,切断通话,并三次输入另一个号码ber,你可以很容易地对这些进行编码,但我如何知道状态?当通话结束或取消或其他情况时?在这里我帮不了你,你需要一位电信专家,因为这是电话操作系统之外的,我相信有办法,但只有一位电信编程人员可以帮助你