0

是否有一款应用程序可以通过 LAN 公开所有安卓手机的原生 API?

你至少可以下载一款优秀的应用程序,它允许通过一个 RESTful API 发送和接收文本消息。但是,它是由其他开发人员制作的,所以我不能 100% 确定安全性。此外,我想访问一切,而不仅仅是短信。

我尝试在线搜索,但那里什么都没有,或者搜索词组合类似于暴力破解密码。

我希望能够通过我选择的语言来享受混搭桌面集成系统的乐趣。

我认为解决方案是在我的手机上运行的服务,它可以完全访问所有手机功能,需要安全的 API 密钥。它将在我的桌子上,插入充电器,所以我不关心电源效率(轮询),但双二进制模型会很有吸引力(注册一个回调端点,它在收到短信等电话事件时调用,或者电话铃声等)。

有任何想法吗?我需要自己做这个吗?

4

2 回答 2

0

好的,不是单一的应用程序解决方案,但您可以执行以下操作:

  • SMS - 使用 SMS 网关。当 SMS 到达时,此应用程序将发布到您选择的 HTTP 服务器
  • 加速度计 - 使用无线 IMU。此应用程序将通过 UDP 发送。这意味着您可以保持低延迟操作,丢弃的数据包永远丢失。[有关其他应用程序选项,请参见http://www.appszoom.com/android_applications/accelerometer+sensor+values+to+computer ]
  • NFC - 未找到
  • 电话 - 未找到
  • 相机(流媒体) - 未找到
  • 拍照 - 未找到

未找到 - 未找到用于指定目的的开放 API 应用程序。

接收加速度计数据 - UDP

class Inertia : IDisposable
{
    UdpClient listener = new UdpClient(5555);
    IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 5555);
    Control context = null;

    public Inertia(Control context)
    {
        this.context = context;
        IAsyncResult result = listener.BeginReceive(new AsyncCallback(udpCallback), null);
    }

    private void udpCallback(IAsyncResult result)
    {
        byte[] data = listener.EndReceive(result, ref groupEP);

        if (data.Length > 0)
        {
            string line = ASCIIEncoding.ASCII.GetString(data);
            if (context.InvokeRequired)
                context.BeginInvoke(UDPStringReceived, line);
            else
                if (UDPStringReceived != null) UDPStringReceived(line);
        }

        result = listener.BeginReceive(new AsyncCallback(udpCallback), null);
    }

    public delegate void UDPStringReceivedHandler(string line);
    public event UDPStringReceivedHandler UDPStringReceived;


    public void Dispose()
    {
        //TODO: Stop listening
    }
}

使用 Inertia 类与 WinForms 一起使用:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load;
    }

    Inertia inertia = null;
    void Form1_Load(object sender, EventArgs e)
    {
        inertia = new Inertia(this);
        inertia.UDPStringReceived += inertia_UDPStringReceived;
    }

    void inertia_UDPStringReceived(string line)
    {
        try
        {
            string[] components = line.Split(',');

            //My text boxes, showing the data
            t.Text = components[0];
            //index 1 contains the value 2, which probably indicates "Accelerometer" in next 3 values
            aX.Text = components[2];
            aY.Text = components[3];
            aZ.Text = components[4];
            //index 5 contains the value 3, which probably indicates "Gyroscope" in next 3 values
            gX.Text = components[6];
            gY.Text = components[7];
            gZ.Text = components[8];
        }
        catch (Exception ex)
        {
        }

    }
}
于 2013-10-01T06:22:58.840 回答
0

一个实际示例,说明当系统应用程序正在执行其网络工作(主要是媒体同步、消息同步)时,您可能需要做些什么来捕获 REST/网络调用层......

假设您想拦截照片库应用程序在同步其媒体时发出的 REST 调用...

包装与您的 Rest api 相关的 HttpClient 的网络调用被封装在一个非常深且非常专有的堆栈中,您可以在这里了解

查看'loadMediaSets()','loadMediaSet()'并注意没有涉及HttpClient或rest的接口。网络涉及“dataInputStreams”,这些“dataInputStreams”由不同的(非 Rest)接口包装,您无法期望观察或过载。

系统应用程序中跨网络的媒体通道不值得用 REST Api 的简单概念来理解。

如果您要花大量时间使用 Android api,您可以在状态栏中列出客户端事件列表,例如“OnNewTextMessage”或其他内容。同样,对于您希望拦截的每种媒体类型,这将是大量的低级工作。

于 2013-09-30T15:25:03.480 回答