parent
fccaea3567
commit
862f4f351c
@ -0,0 +1 @@
|
|||||||
|
/Users/datang/fvm/versions/2.8.0
|
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"flutterSdkVersion": "2.8.0",
|
||||||
|
"flavors": {}
|
||||||
|
}
|
@ -1,217 +0,0 @@
|
|||||||
package com.example.project_telephony;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2007 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.telephony.NeighboringCellInfo;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface used to interact with the phone. Mostly this is used by the
|
|
||||||
* TelephonyManager class. A few places are still using this directly.
|
|
||||||
* Please clean them up if possible and use TelephonyManager insteadl.
|
|
||||||
*
|
|
||||||
* {@hide}
|
|
||||||
*/
|
|
||||||
interface ITelephony {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dial a number. This doesn't place the call. It displays
|
|
||||||
* the Dialer screen.
|
|
||||||
* @param number the number to be dialed. If null, this
|
|
||||||
* would display the Dialer screen with no number pre-filled.
|
|
||||||
*/
|
|
||||||
void dial(String number);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Place a call to the specified number.
|
|
||||||
* @param number the number to be called.
|
|
||||||
*/
|
|
||||||
void call(String number);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If there is currently a call in progress, show the call screen.
|
|
||||||
* The DTMF dialpad may or may not be visible initially, depending on
|
|
||||||
* whether it was up when the user last exited the InCallScreen.
|
|
||||||
*
|
|
||||||
* @return true if the call screen was shown.
|
|
||||||
*/
|
|
||||||
boolean showCallScreen();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Variation of showCallScreen() that also specifies whether the
|
|
||||||
* DTMF dialpad should be initially visible when the InCallScreen
|
|
||||||
* comes up.
|
|
||||||
*
|
|
||||||
* @param showDialpad if true, make the dialpad visible initially,
|
|
||||||
* otherwise hide the dialpad initially.
|
|
||||||
* @return true if the call screen was shown.
|
|
||||||
*
|
|
||||||
* @see showCallScreen
|
|
||||||
*/
|
|
||||||
boolean showCallScreenWithDialpad(boolean showDialpad);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* End call or go to the Home screen
|
|
||||||
*
|
|
||||||
* @return whether it hung up
|
|
||||||
*/
|
|
||||||
boolean endCall();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Answer the currently-ringing call.
|
|
||||||
*
|
|
||||||
* If there's already a current active call, that call will be
|
|
||||||
* automatically put on hold. If both lines are currently in use, the
|
|
||||||
* current active call will be ended.
|
|
||||||
*
|
|
||||||
* TODO: provide a flag to let the caller specify what policy to use
|
|
||||||
* if both lines are in use. (The current behavior is hardwired to
|
|
||||||
* "answer incoming, end ongoing", which is how the CALL button
|
|
||||||
* is specced to behave.)
|
|
||||||
*
|
|
||||||
* TODO: this should be a oneway call (especially since it's called
|
|
||||||
* directly from the key queue thread).
|
|
||||||
*/
|
|
||||||
void answerRingingCall();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Silence the ringer if an incoming call is currently ringing.
|
|
||||||
* (If vibrating, stop the vibrator also.)
|
|
||||||
*
|
|
||||||
* It's safe to call this if the ringer has already been silenced, or
|
|
||||||
* even if there's no incoming call. (If so, this method will do nothing.)
|
|
||||||
*
|
|
||||||
* TODO: this should be a oneway call too (see above).
|
|
||||||
* (Actually *all* the methods here that return void can
|
|
||||||
* probably be oneway.)
|
|
||||||
*/
|
|
||||||
void silenceRinger();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are in either an active or holding call
|
|
||||||
* @return true if the phone state is OFFHOOK.
|
|
||||||
*/
|
|
||||||
boolean isOffhook();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if an incoming phone call is ringing or call waiting.
|
|
||||||
* @return true if the phone state is RINGING.
|
|
||||||
*/
|
|
||||||
boolean isRinging();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the phone is idle.
|
|
||||||
* @return true if the phone state is IDLE.
|
|
||||||
*/
|
|
||||||
boolean isIdle();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check to see if the radio is on or not.
|
|
||||||
* @return returns true if the radio is on.
|
|
||||||
*/
|
|
||||||
boolean isRadioOn();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the SIM pin lock is enabled.
|
|
||||||
* @return true if the SIM pin lock is enabled.
|
|
||||||
*/
|
|
||||||
boolean isSimPinEnabled();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cancels the missed calls notification.
|
|
||||||
*/
|
|
||||||
void cancelMissedCallsNotification();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Supply a pin to unlock the SIM. Blocks until a result is determined.
|
|
||||||
* @param pin The pin to check.
|
|
||||||
* @return whether the operation was a success.
|
|
||||||
*/
|
|
||||||
boolean supplyPin(String pin);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated
|
|
||||||
* without SEND (so <code>dial</code> is not appropriate).
|
|
||||||
*
|
|
||||||
* @param dialString the MMI command to be executed.
|
|
||||||
* @return true if MMI command is executed.
|
|
||||||
*/
|
|
||||||
boolean handlePinMmi(String dialString);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggles the radio on or off.
|
|
||||||
*/
|
|
||||||
void toggleRadioOnOff();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the radio to on or off
|
|
||||||
*/
|
|
||||||
boolean setRadio(boolean turnOn);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request to update location information in service state
|
|
||||||
*/
|
|
||||||
void updateServiceLocation();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable location update notifications.
|
|
||||||
*/
|
|
||||||
void enableLocationUpdates();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable location update notifications.
|
|
||||||
*/
|
|
||||||
void disableLocationUpdates();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable a specific APN type.
|
|
||||||
*/
|
|
||||||
int enableApnType(String type);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable a specific APN type.
|
|
||||||
*/
|
|
||||||
int disableApnType(String type);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allow mobile data connections.
|
|
||||||
*/
|
|
||||||
boolean enableDataConnectivity();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disallow mobile data connections.
|
|
||||||
*/
|
|
||||||
boolean disableDataConnectivity();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Report whether data connectivity is possible.
|
|
||||||
*/
|
|
||||||
boolean isDataConnectivityPossible();
|
|
||||||
|
|
||||||
Bundle getCellLocation();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the neighboring cell information of the device.
|
|
||||||
*/
|
|
||||||
List<NeighboringCellInfo> getNeighboringCellInfo();
|
|
||||||
|
|
||||||
int getCallState();
|
|
||||||
int getDataActivity();
|
|
||||||
int getDataState();
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
package com.example.project_telephony;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.telephony.PhoneStateListener;
|
|
||||||
import android.telephony.SmsManager;
|
|
||||||
import android.telephony.TelephonyManager;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import io.flutter.Log;
|
|
||||||
|
|
||||||
public class MyPhoneStateListener extends PhoneStateListener {
|
|
||||||
Context context;
|
|
||||||
int flag = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCallStateChanged(int state, String incomingNumber) {
|
|
||||||
Log.e("PhoneCallState", incomingNumber);
|
|
||||||
try {
|
|
||||||
switch (state) {
|
|
||||||
case TelephonyManager.CALL_STATE_IDLE: // 当前电话处于闲置状态
|
|
||||||
Log.i("state", "闲置");
|
|
||||||
if (flag != 0) {
|
|
||||||
Log.e("state", "发短信给"+incomingNumber);
|
|
||||||
SmsMassage.sendMess("1","10086");
|
|
||||||
flag = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TelephonyManager.CALL_STATE_RINGING: // 当前电话处于响铃状态
|
|
||||||
Log.i("state", "响铃");
|
|
||||||
flag++;
|
|
||||||
break;
|
|
||||||
case TelephonyManager.CALL_STATE_OFFHOOK: // 当前电话处于接听状态
|
|
||||||
Log.i("state", "接听");
|
|
||||||
flag++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
super.onCallStateChanged(state, incomingNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
package com.example.project_telephony;
|
|
||||||
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.IBinder;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.core.app.NotificationCompat;
|
|
||||||
|
|
||||||
public class MyService extends Service {
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "messages")
|
|
||||||
.setContentText("正在后台运行")
|
|
||||||
.setContentTitle("Flutter后台")
|
|
||||||
.setSmallIcon(R.drawable.launch_background);
|
|
||||||
startForeground(101, builder.build());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
package com.example.project_telephony;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.telephony.SmsManager;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class SmsMassage extends Activity {
|
|
||||||
public static void sendMess(String content, String phone) {
|
|
||||||
SmsManager manager = SmsManager.getDefault();
|
|
||||||
manager.sendTextMessage(phone, null, content, null, null);
|
|
||||||
ArrayList<String> strings = manager.divideMessage(content);
|
|
||||||
for (int i = 0; i < strings.size(); i++) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void requestPermission() {
|
|
||||||
if(ContextCompat.checkSelfPermission(SmsMassage.this, Manifest.permission.SEND_SMS)!=
|
|
||||||
PackageManager.PERMISSION_GRANTED){
|
|
||||||
ActivityCompat.requestPermissions(SmsMassage.this,new String[]{
|
|
||||||
Manifest.permission.SEND_SMS},1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
||||||
Toast.makeText(SmsMassage.this, "申请权限", Toast.LENGTH_LONG).show();
|
|
||||||
|
|
||||||
switch(requestCode){
|
|
||||||
case 1:
|
|
||||||
if(grantResults.length>0&&grantResults[0]!=PackageManager.PERMISSION_GRANTED){
|
|
||||||
// showToast("拒绝权限将无法使用程序");
|
|
||||||
Toast.makeText(SmsMassage.this, "拒绝权限将无法使用程序1111", Toast.LENGTH_LONG).show();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:call_log/call_log.dart';
|
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:telephony/telephony.dart';
|
|
||||||
|
|
||||||
class MainProvider extends ChangeNotifier {
|
|
||||||
final telephony = Telephony.instance;
|
|
||||||
String? st, data, num;
|
|
||||||
int flag = 0;
|
|
||||||
String? phoneNum;
|
|
||||||
|
|
||||||
callState() async {
|
|
||||||
CallState state = await telephony.callState;
|
|
||||||
transState(state.name);
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void addListener(VoidCallback listener) {
|
|
||||||
super.addListener(listener);
|
|
||||||
callState();
|
|
||||||
}
|
|
||||||
|
|
||||||
transState(String? callState) async {
|
|
||||||
if (callState == "IDLE") {
|
|
||||||
if (flag != 0) {
|
|
||||||
await getNum();
|
|
||||||
telephony.sendSms(to: phoneNum!, message: "发送短信内容",isMultipart:true,);
|
|
||||||
flag = 0;
|
|
||||||
}
|
|
||||||
} else if (callState == "RINGING") {
|
|
||||||
flag++;
|
|
||||||
} else if (callState == "OFFHOOK") {
|
|
||||||
flag++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getNum() async {
|
|
||||||
final Iterable<CallLogEntry> result = await CallLog.query();
|
|
||||||
phoneNum = result.first.number;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in new issue