delphi xe 开发

1,761 阅读2分钟

介绍

废话不多说,直接上代码,本编文章是针对编译打包代码的sdk < 23 版本的(delphi 10.3 以前版本,不包含10.3),也就是不需要获取运行时权限(动态获取权限)的实例,如果对动态获取权限不理解,请先自行百度 可以参考这里动态权限获取

第一 本案例下面的示例所需要引用的全部单元

  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, System.NetEncoding,
  Androidapi.JNI.Net,
  FMX.Helpers.Android,
  FMX.Platform.Android,
  Androidapi.Helpers,
  Androidapi.JNIBridge,
  Androidapi.JNI.Widget,
  Androidapi.JNI.App,
  Androidapi.JNI.Os,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Provider,
  Androidapi.JNI.GraphicsContentViewText,
  FMX.PhoneDialer.Android, FMX.Edit, FMX.ScrollBox,
  FMX.Memo, uSkinFireMonkeyMemo; 
  

第二 打开某个应用的特定界面 对应被打开的页面必须 exported:="true"

procedure TForm1.Button1Click(Sender: TObject);
var
   intent: JIntent;
   ComponentName:JComponentName;
begin
    //打开某个应用的特定界面  对应被打开的页面必须 exported:="true"
    intent:=TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_MAIN);
    intent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER);
    ComponentName:=TJComponentName.JavaClass.init(
    StringToJString('com.hlcx.hello'), //包名
    StringToJString('com.hlcx.hello.ui.CardViewActivity')  //具体页面的完整类名
    );
    intent.setComponent(ComponentName);
    TAndroidHelper.Context.startActivity(intent);

end;

第三 打开支付宝页面

procedure TForm1.Button2Click(Sender: TObject);
var
   intent: JIntent;
   ComponentName:JComponentName;
   PhoneUrl: Jnet_Uri;
begin
   //打开支付宝页面
   PhoneUrl := StrToJURI('alipayqr://platformapi/startapp?clientVersion=3.7.0.0718;');
   Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
   PhoneUrl);
   TAndroidHelper.Context.startActivity(Intent);
end;

第四 打电话

procedure TForm1.Button3Click(Sender: TObject);
var
   PhoneUrl: Jnet_Uri;
   Intent: JIntent;
   FDialingNumber,APhoneNumber:string;
begin
  // 这里写电话号码
   APhoneNumber:='12345789';
   FDialingNumber := APhoneNumber.Replace('#', TNetEncoding.URL.Encode('#'));
   PhoneUrl := StrToJURI(Format('tel:%s', [FDialingNumber]));
   Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_CALL,
   PhoneUrl);
   TAndroidHelper.Context.startActivity(Intent);
end;

第五 直接跳转到支付宝转账页面

procedure TForm1.Button5Click(Sender: TObject);
var
   PhoneUrl: Jnet_Uri;
   Intent: JIntent;
   surl:string;
begin
   //这个字符串 不懂 百度 android 跳转到支付宝收款页面 替换成自己的收款码
   surl:='intent://platformapi/startapp?saId=10000007&' +
                'clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2FFKX060379IKLUWTZJGQ7F4%3F_s' +
                '%3Dweb-other&_t=1472443966571#Intent;' +
                'scheme=alipayqr;package=com.eg.android.AlipayGphone;end';
   
   Intent := TJIntent.JavaClass.parseUri(stringToJstring(surl),
   TJIntent.JavaClass.URI_INTENT_SCHEME);
   TAndroidHelper.Context.startActivity(Intent);
   FMX.Types.Log.d('跳转成功');
end;

第六 获取通话记录相关信息 时长 联系人 电话号码 通话时间......

procedure TForm1.Button4Click(Sender: TObject);
var
  Filter: string;
  Projection: TJavaObjectArray<JString>;
  GroupCursor: JCursor;
  temp:string;

begin
  MEMO1.Lines.Clear;
  MEMO1.Lines.Add('');
   Projection := CreateJavaStringArray([TJCallLog_Calls.JavaClass.CACHED_NAME,
                                       TJCallLog_Calls.JavaClass.NUMBER,
                                       TJCallLog_Calls.JavaClass.DATE,
                                       TJCallLog_Calls.JavaClass.DURATION]);
  try
    try
      GroupCursor := TAndroidHelper.ContentResolver.query
      (TJCallLog_Calls.JavaClass.CONTENT_URI, Projection,
        nil, nil, TJCallLog_Calls.JavaClass.DEFAULT_SORT_ORDER);
      if GroupCursor <> nil then
        try

          while GroupCursor.moveToNext do
          begin
            //得到通话姓名
            temp:='';
            temp:=' 姓名:'+JStringToString(
            GroupCursor.getString(
            GroupCursor.getColumnIndex(TJCallLog_Calls.JavaClass.CACHED_NAME)
            ));
            //得到通话号码 
            temp:=temp+' 电话号码:'+JStringToString(
            GroupCursor.getString(
            GroupCursor.getColumnIndex(TJCallLog_Calls.JavaClass.NUMBER)
            ));
             //得到通话时间 这里是时间戳 自己转换下就行了
            temp:=temp+' 通话时间 :'+
            GroupCursor.getLong(
                GroupCursor.getColumnIndex(TJCallLog_Calls.JavaClass.DATE)
                ).ToString;
             //得到通话时长
            temp:=temp+' 通话时长s:'+
            GroupCursor.getInt(
            GroupCursor.getColumnIndex(TJCallLog_Calls.JavaClass.DURATION)
            ).ToString;
            FMX.Types.Log.d(temp);
            
            MEMO1.Lines.Add(temp);
          end;
        finally
          GroupCursor.close;
        end
    except on E: EJNIException do
      ShowMessage('抱歉  出错了') ;
    end;
  finally
    Projection.Free;
  end;
end;

第七 调用android 原生的Toast 吐司 显示位置 居中显示

procedure TForm1.Button6Click(Sender: TObject);
var
   toast:JToast;
begin
   toast:=TJToast.JavaClass.makeText(TAndroidHelper.Activity.getApplicationContext(),
     StrToJCharSequence('你好,我是原生的Toast'),TJToast.JavaClass.LENGTH_SHORT);
   toast.setGravity(17,0,0);
   toast.show();
end;