- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将我的 JavaFX 应用程序移植到了我的 Android 设备上。我希望我的应用程序读取传入的 SMS 消息并将其存储在数据库中。我在 StackOverflow 中发现了几个问题,但我不知道如何在 JavaFX 方法中实现。请帮忙!
最佳答案
这些是创建 JavaFX 应用程序并将其移植到 Android 设备所需的步骤,因此您可以跟踪 SMS 消息,允许:
第一步
使用 Gluon plugin为 NetBeans 创建一个新的 JavaFX 项目。我们称它为 SMSTracker,主类为 org.jpereda.sms.SMSTrackerFX
。在 build.gradle
上,将 jfxmobile 插件版本更新为 b9:
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.0.0-b9'
}
首先让我们创建 SMSMessage
,这是一个带有我们模型的 JavaFX pojo:
public class SMSMessage {
private final StringProperty id;
private final StringProperty address;
private final StringProperty msg;
private final StringProperty readState; //"0" not read, "1" read sms
private final StringProperty time;
private final StringProperty folderName;
public SMSMessage(String id, String address, String msg, String readState, String time, String folderName){
this.id = new SimpleStringProperty(id);
this.address = new SimpleStringProperty(address);
this.msg = new SimpleStringProperty(msg);
this.readState = new SimpleStringProperty(readState);
this.time = new SimpleStringProperty(time);
this.folderName = new SimpleStringProperty(folderName);
}
public String getId() {
return id.get();
}
public StringProperty idProperty() {
return id;
}
public String getAddress() {
return address.get();
}
public StringProperty addressProperty() {
return address;
}
public String getMsg() {
return msg.get();
}
public StringProperty msgProperty() {
return msg;
}
public String getReadState() {
return readState.get();
}
public StringProperty readStateProperty() {
return readState;
}
public String getTime() {
return time.get();
}
public StringProperty timeProperty() {
return time;
}
public String getFolderName() {
return folderName.get();
}
public StringProperty folderNameProperty() {
return folderName;
}
@Override
public String toString(){
return id.get()+ ": " + address.get() + ": " + msg.get();
}
}
使用 ScenicBuilder 和 FXML 或通过代码,创建您的 UI。对于此示例,它将是一个包含三个主要区域的简单 UI,用于上述三个选项。
public class SMSTrackerFX extends Application {
@Override
public void start(Stage stage) {
BorderPane root = new BorderPane();
/*
TOP :: Sending SMS
Warning: This may by subjected to costs to your mobile account
*/
Button buttonSend = new Button("Send SMS");
TextField number = new TextField();
number.setPromptText("Insert number");
HBox.setHgrow(number, Priority.ALWAYS);
HBox hbox = new HBox(10,buttonSend, number);
TextField message = new TextField();
message.setPromptText("Insert text");
HBox.setHgrow(message, Priority.ALWAYS);
VBox vboxTop = new VBox(10,hbox,message);
buttonSend.disableProperty().bind(Bindings.createBooleanBinding(()->{
return number.textProperty().isEmpty()
.or(message.textProperty().isEmpty()).get();
}, number.textProperty(),message.textProperty()));
vboxTop.setPadding(new Insets(10));
root.setTop(vboxTop);
/*
CENTER :: Reading SMS Inbox
*/
Button button = new Button("Read SMS Inbox");
ListView<SMSMessage> view = new ListView<>();
view.setCellFactory(data -> new SMSListCell());
VBox.setVgrow(view, Priority.ALWAYS);
VBox vboxCenter = new VBox(10,button,view);
vboxCenter.setPadding(new Insets(10));
root.setCenter(vboxCenter);
/*
BOTTOM :: Listening to incoming SMS
*/
Label incoming = new Label("No messages");
VBox vboxBottom = new VBox(10,new Label("Incoming SMS"),incoming);
vboxBottom.setPadding(new Insets(10));
root.setBottom(vboxBottom);
Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(root, visualBounds.getWidth(), visualBounds.getHeight());
stage.setScene(scene);
stage.show();
}
private static class SMSListCell extends ListCell<SMSMessage> {
@Override
protected void updateItem(SMSMessage item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty) {
setGraphic(new Label(item.getId()+ ": " + item.getMsg()));
} else {
setGraphic(null);
}
}
}
}
这就是我们现在拥有的:
第 2 步
关注 HelloPlatform sample ,我们将添加一个 PlatformService
类和一个 PlatformProvider
接口(interface),以及所需的服务:
public interface PlatformProvider {
void sendSMS(String number, String message);
List<SMSMessage> readSMSs();
void listenToIncomingSMS();
ObjectProperty<SMSMessage> messageProperty();
}
此接口(interface)将在三个平台(桌面、iOS 和 Android)中的每一个上实现。显然,我们将只关注 Android 实现。
这是 NetBeans 上的项目 View ,包含所有涉及的包和文件:
第 3 步
现在让我们在 Android 上实现服务。为此,我在 SO 上遵循了几个很好的答案:发送 SMS , 阅读 inbox并收听传入的 SMS .
从上一个开始,我们可以创建一个类,在每次接收到一个SMSMessage
对象时设置一个ObjectProperty
:
public class SmsListener extends BroadcastReceiver {
private final ObjectProperty<SMSMessage> messages = new SimpleObjectProperty<>();
@Override
public void onReceive(Context cntxt, Intent intent) {
if(intent.getAction().equals(Intents.SMS_RECEIVED_ACTION)){
for (SmsMessage smsMessage : Intents.getMessagesFromIntent(intent)) {
SMSMessage sms = new SMSMessage("0", smsMessage.getOriginatingAddress(),
smsMessage.getMessageBody(), smsMessage.getStatus()==1?"read":"not read",
Long.toString(smsMessage.getTimestampMillis()), "inbox");
messages.set(sms);
}
}
}
public ObjectProperty<SMSMessage> messagesProperty() {
return messages;
}
}
为了启动此监听器,我们使用 FXActivity
(扩展 Android Context 类并提供对 Android 服务的访问的类)来注册 SmsListener
:
public class AndroidPlatformProvider implements PlatformProvider {
private final SmsListener receiver = new SmsListener();
@Override
public void listenToIncomingSMS() {
FXActivity.getInstance().registerReceiver(receiver, new IntentFilter(Intents.SMS_RECEIVED_ACTION));
}
@Override
public ObjectProperty<SMSMessage> messagesProperty() {
return receiver.messagesProperty();
}
}
第四步
最后,我们需要做的就是将属性与我们在 UI 上的标签绑定(bind)并开始广播:
@Override
public void start(Stage stage) {
...
PlatformService.getInstance().messageProperty().addListener(
(obs,s,s1)->{
Platform.runLater(()->incoming.setText(s1.toString()));
});
// start broadcast
PlatformService.getInstance().listenToIncomingSMS();
}
注意使用 Platform.runLater()
来更新标签:广播线程不同于 JavaFX 线程。
第 5 步
构建 apk 之前的最后一步是修改 AndroidManifest.xml
文件以请求所需的权限。
由于 jfxmobile-plugin 默认会创建一个,因此在此阶段运行 gradlew android
将生成它。它位于 SMSTracker\build\javafxports\tmp\android
文件夹下。
将其复制到另一个位置 (SMSTracker\lib
) 并将其引用包含在 build.gradle
文件中:
jfxmobile {
android {
manifest = 'lib/AndroidManifest.xml'
}
}
现在编辑文件并添加所需的权限和接收者:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.jpereda.sms" android:versionCode="1" android:versionName="1.0">
<supports-screens android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="21"/>
<application android:label="SMSTracker" android:name="android.support.multidex.MultiDexApplication">
<activity android:name="javafxports.android.FXActivity" android:label="SMSTracker" android:configChanges="orientation|screenSize">
<meta-data android:name="main.class" android:value="org.jpereda.sms.SMSTrackerFX"/>
<meta-data android:name="debug.port" android:value="0"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name=".SmsListener">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
保存、构建并运行 gradlew androidInstall
将 apk 上传到您的设备。
完整项目
关于java - 如何分析传入消息(Android 上的 JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862853/
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: How do I copy an object in Java? 我的类中有一个函数 Claus它调用一个函数来接受
任何人都可以给我一个 linux 内核驱动程序手册或示例的链接,它可以修改来自/到指定 ip 端口的传入/传出数据包吗? 谢谢! 最佳答案 Kprobes 是一种可以做到这一点的方法。这是一个使用具有
我有一个 3rd 方网站,该网站具有发送到特定 url 的 webhook。我将其设置为发送到我网站上的空白页面(例如:www.mysite.com/webhook.php) 我在 webhook.p
我对传递的约定感到困惑*args在 super().__init__()在python继承中。 我了解需要使用关键字参数 **kwargs因此,如果需要,CRO 中的类可以采用所需的参数,但为什么还有
我有一个 webapi (.NET core 3.1) 方法,它正在获取 XML 并反序列化为对象。但是一些标签的开头和结尾是不一样的。例如,如果以 打开然后它以 关闭.因此 XML 格式不正确。
是否有一个 hg 命令可以组合 hg传入 + hg传出 + hg status? 这会告诉您是否有任何远程内容需要传入,是否有任何本地提交的内容需要出去,或者是否有任何本地更改需要提交。 最佳答案 虽
据我了解,你无法在两部 iPhone 之间建立连接(如果我错了,请纠正我)。因此,我想做的是在客户端应用程序之间放置一台服务器,该服务器接受消息并将其重新分发给适当的人员。本质上,该应用程序将允许人们
我正在使用 Apache Camel 向我的 Java 服务发送消息。我在消费者路线上保留了 transacted=true。我还需要发送有关成功处理 JMS 消息的电子邮件。 我正在使用以下代码来注
这个问题在这里已经有了答案: What does "this" point to? (5 个答案) 关闭 4 年前。 public class CommandForm extends Form im
我是一名 Swift 开发人员,也是 Dart 的新手。我正在尝试编写一些通用方法。 我想知道我是否可以在 Dart 中实现类似的事情。 //Swift version public func mod
基本上有人问我是否有任何方法可以捕获和下载通过邮件服务器的所有传入和传出电子邮件(最好是文本格式)。这种下载方法需要使用PHP或类似的服务器端语言来完成。 如果我能通过上述阶段,那么最终目标就很容易实
我正在学习 Flask 并且有一个关于动态路由的问题:是否可以传入一个可接受的路由列表?我注意到 any 转换器有潜力,但很难找到它的使用示例。基本上我有不同的端点组,它们应该在它们之间触发相同的 A
我正在学习如何使用 pthread 函数。在这里我想使用 pthread_create 创建一个线程并用它计算一些数字的平均值。(数字序列末尾的0表示已经完成) 这是我到目前为止写的: #includ
我需要传递一个带有字段“nombre”作为参数的条件 目前我这样做: @xcondicion= {:nombre.like => "%#{params[:qyBusqueda]}%"} cliente
我有以下两个 parseInt(),我不太清楚为什么它们会给我不同的结果: alert(parseInt(0.00001)) 显示 0; alert(parseInt(0.00000001)) 显示
我有一个使用 SODA 包来操作 JSON 数据库的 PL/SQL 处理程序。我想: 读取有效负载中键 id 的值 将负载 JSON 写入数据库中的新文档。 要执行第 1 步,处理程序将 :body
我正在使用 Oracle 试用 Dapper,我试图运行多结果集查询,但 Oracle 需要 dbtype 的 refcursor。 StringBuilder query = new StringB
我在将“工作表”选项卡重命名为任何文件名时遇到问题。这样做的问题是,如果用户意外下载工作表两次,Windows 会将 template(1).csv 附加到文件中,以保持其下载目录中的唯一性。在 Ex
我将 id 作为字符串传递到函数中。我想使用该 ID 来更改背景颜色。我用过: $("#"+address).css("background-color", "#3399FF"); 但它没有改变背景颜
我有一个 ListSourceAdapter.java 类, class ListSourceViewHolder extends RecyclerView.ViewHolder implements
我是一名优秀的程序员,十分优秀!