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