Delphi Android实例-红外线操作(XE10.2+小米5)


本文整理自网络,侵删。

 
相关资料:
http://blog.csdn.net/qq_21752153/article/details/50244717
https://developer.xamarin.com/api/type/Android.Hardware.ConsumerIrManager/
https://forums.embarcadero.com/thread.jspa?messageID=876851
结果:
1.在取出来的支持Hz范围不知道为什么出错,哪位大神了解的,可以指点一下。谢了。
2.注意一定要增加红外线权限。
3.发送的信息最多2秒时间。

实例代码:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls,
  Androidapi.Helpers,//需要引入
  AndroidAPI.jni.OS,//需要引入
  Androidapi.JNIBridge,//需要引入
  Androidapi.JNI.GraphicsContentViewText,//需要引入
  Androidapi.JNI.JavaTypes,//需要引入
  FMX.Helpers.Android;//需要引入

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

//外国大神写的
type
  JConsumerIrManager_CarrierFrequencyRange = interface;

  JConsumerIrManager_CarrierFrequencyRangeClass = interface(JObjectClass)
    ['{191A7F08-B93B-40D4-9B6E-3D908B37578E}']
    {class} function init(min, max: Integer): JConsumerIrManager_CarrierFrequencyRange; cdecl;
  end;

  [JavaSignature('android/hardware/ConsumerIrManager$CarrierFrequencyRange')]
  JConsumerIrManager_CarrierFrequencyRange = interface(JObject)
    ['{5AC0C73D-9DA2-49B0-A072-55EA03FE3B78}']
    function getMaxFrequency: Integer; cdecl;
    function getMinFrequency: Integer; cdecl;
  end;
  TJConsumerIrManager_CarrierFrequencyRange = class(TJavaGenericImport<JConsumerIrManager_CarrierFrequencyRangeClass, JConsumerIrManager_CarrierFrequencyRange>) end;

  JConsumerIrManagerClass = interface(JObjectClass)
    ['{C8AB7EEA-046F-429C-8585-EF69EBB53718}']
  end;

  [JavaSignature('android/hardware/ConsumerIrManager')]
  JConsumerIrManager = interface(JObject)
    ['{FF469731-5B57-46AB-9C83-4FB51CA6F2BA}']
    function getCarrierFrequencies: TJavaArray<JConsumerIrManager_CarrierFrequencyRange>; cdecl;
    function hasIrEmitter: Boolean; cdecl;
    procedure transmit(carrierFrequency: Integer; pattern: TJavaArray<Integer>); cdecl;
  end;
  TJConsumerIrManager = class(TJavaGenericImport<JConsumerIrManagerClass, JConsumerIrManager>) end;


var
  Form1: TForm1;

implementation

{$R *.fmx}

function MakeJavaIntArray(arr: array of Integer): TJavaArray<Integer>;
var
  I: Integer;
begin
  Result := TJavaArray<Integer>.Create(Length(arr));
  for I := Low(arr) to High(arr) do
    Result.Items[I] := arr[I];
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  mCIR: JConsumerIrManager;
  mRanges: TJavaArray<JConsumerIrManager_CarrierFrequencyRange>;
  mRange: JConsumerIrManager_CarrierFrequencyRange;
  I, DesiredFrequency: Integer;
  HasDesiredFrequency: Boolean;
begin
  //得到红外服务
  mCIR := TJConsumerIrManager.Wrap((SharedActivityContext.getSystemService(TJContext.JavaClass.CONSUMER_IR_SERVICE)
    as ILocalObject).GetObjectID);
  //查看手机是否支持红外功能
  if mCIR.hasIrEmitter then
  begin
    //根据需要使用红外线
    DesiredFrequency := 3800;//一般的遥控板都是38KHz
    HasDesiredFrequency := False;
    //mRanges := mCIR.getCarrierFrequencies;//获得支持的Hz范围(不知道为什么我得到一个范围,取里面的值时出错了,我只能注掉)
    //for I := 0 to mRanges.Length-1 do
    //begin
    //mRange := mRanges.Items[I];
    //if (DesiredFrequency >= mRange.getMinFrequency) and (DesiredFrequency <= mRange.getMaxFrequency) then
    //begin
    //HasDesiredFrequency := True;
    //Break;
    //end;
    //end;
    //
    //if HasDesiredFrequency then
    //发送红外信号内容
    mCIR.transmit(DesiredFrequency, MakeJavaIntArray([8950,4350,650,500,600,500,550,600,550,550,600,500,550,550,600,550,600,500,550,1650,600,1600,650,1600,550,1700,600,1600,600,1600,600,1650,600,1600,650,1600,550,1650,650,1600,600,550,550,550,550,550,550,550,600,500,600,550,550,550,550,550,550,1650,650,1600,600,1600,600,1650,600,1600,600])); //pattern values here
  end;
end;

end.

配置文件:
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="%package%"
        android:versionCode="%versionCode%"
        android:versionName="%versionName%"
        android:installLocation="%installLocation%">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%">

<%application-meta-data%>
        <%services%>
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="%libNameValue%" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>
        <%activity%>
        <%receivers%>
    </application>    
    <uses-permission android:name="android.permission.TRANSMIT_IR" />
    <uses-feature android:name="android.hardware.consumerir" android:required="false"/>
</manifest>
<!-- END_INCLUDE(manifest) -->

来源:https://www.cnblogs.com/FKdelphi/p/7248301.html

相关阅读 >>

Delphi edit 让密码变成点

Delphi 获取本机公网ip

Delphi exe图标替换

Delphi treeview节点展开与折叠

Delphi 一个线程安全的轻量级的日志类

Delphi 磁盘类型 getdrivetype

Delphi stringtowidestring widestringtostring

Delphi中对excel表格文件的导入和导出操作

Delphi 创建console-控制台应用

Delphi 调用js脚本

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...