Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Obtener el nombre del dispositivo Androoid. (https://www.clubdelphi.com/foros/showthread.php?t=91283)

jhonalone 19-12-2016 14:01:20

Obtener el nombre del dispositivo Androoid.
 
Hola. Compañeros de "fatigas".

Actualmente me encuentro muy "fatigado" intentando conseguir averiguar (por software) el nombre del dispositivo Android. El modelo, en versiones antiguas, que no permitían personalizar el nombre, coincidía con el nombre mostrado por bluetooth. En las versiones más modernas existe la posibilidad de personalizar el nombre que se muestra por bluetooth y este nombre es lo que pretendo conseguir.

Para obtener el modelo estoy utilizando este código (por si a alguien le interesa):

Código Delphi [-]
uses
.....AndroidApi.JNI.OS, AndroidApi.Helpers;
....
var
....ModelTelef : String;
......
 ModelTelef := JStringToString(TJBuild.JavaClass.MODEL);
....

¿Alguien sabe como conseguir (y si fuera posible modificar) el nombre personalizado del dispositivo?

Gracias anticipadas por soportar mi torpeza y por leerme.

Saludos a todos.

Neftali [Germán.Estévez] 19-12-2016 16:13:49

Cita:

Empezado por jhonalone (Mensaje 511873)
En las versiones más modernas existe la posibilidad de personalizar el nombre que se muestra por bluetooth y este nombre es lo que pretendo conseguir.

Si lo que estás intentando es obtener el nombre que el dispositivo tiene definido para el acceso a bluetooth, deberás acceder por las clases que hay específicas de Bluetotth.
En concreto, con delphi viene la unit Androidapi.JNI.Bluetooth.pas.


En esta unit está definido el mapeo sobre la clase de Android BlueToothAdapter.
https://developer.android.com/refere...thAdapter.html

Si miras la documentación verás que entre los métodos que trae, hay uno llamado getName.
https://developer.android.com/refere...html#getName()

Así que un código como este te debería devolver el nombre y algunas cosas más...

Código Delphi [-]
uses
  Androidapi.Helpers,
  Androidapi.JNIBridge,
  AndroidApi.Jni.JavaTypes,
  AndroidApi.Jni.App,
  Androidapi.JNI.Bluetooth;
  
...


var
  adapter:JBluetoothAdapter;
begin
  // acceso al servicio
  Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
  // Obtener datos
  mmLog.Lines.Add('Class: ' + JStringToString(Adapter.getClass.getName));
  mmLog.Lines.Add('Name: ' + JStringToString(Adapter.getName));
  mmLog.Lines.Add('ScanMode: ' + IntToStr(Adapter.getScanMode));
  mmLog.Lines.Add('State: ' + IntToStr(Adapter.getState));
  mmLog.Lines.Add('Adress: ' + JStringToString(Adapter.getAddress));

El resultado es este:


En esa misma clase (ya no lo he probado) también tienes el método setName.

NOTA: Tendrás que activar los permisos para Bluetooth ( y tal vez el bluetooth admin).

jhonalone 19-12-2016 16:31:12

Muchas gracias, Neftalí.

Es que he comprobado que el nombre que envía por BlueTooth coincide con el nombre que has asignado al dispositivo.

Voy a probarlo y te cuento.

Un Saludo.

jhonalone 19-12-2016 17:38:01

A ver, Neftalí.

Estoy probando con el código que me dejaste. Pero algo me debe faltar...

Utilizo este programa de prueba:

Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, AndroidApi.JNI.GraphicsContentViewText, AndroidApi.JNI.OS, AndroidApi.Helpers, AndroidApi.JNI.Net,
  AndroidApi.JNI.JavaTypes, AndroidApi.JNIBridge, AndroidApi.JNI.Provider, AndroidApi.JNI.Telephony,
  FMX.PhoneDialer, FMX.PhoneDialer.Android, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.Bluetooth,
  System.Bluetooth.Components, AndroidApi.Jni.App,
  Androidapi.JNI.Bluetooth;

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

var
  Form1: TForm1;
  Adapter:JBluetoothAdapter;
implementation

{$R *.fmx}



procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Lines.Add('Class: ' + JStringToString(Adapter.getClass.getName));
  Memo1.Lines.Add('Name: ' + JStringToString(Adapter.getName));
  Memo1.Lines.Add('ScanMode: ' + IntToStr(Adapter.getScanMode));
  Memo1.Lines.Add('State: ' + IntToStr(Adapter.getState));
  Memo1.Lines.Add('Adress: ' + JStringToString(Adapter.getAddress));
{Memo1.Lines.Add(JStringToString(TJBuild.JavaClass.MODEL));//Model name
Memo1.Lines.Add(JStringToString(TJBuild_VERSION.JavaClass.RELEASE));//Os Version
//Memo1.Lines.Add(JStringToString(TJBuild.JavaClass.HOST));
// Memo1.Lines.Add(JStringToString(TJBuild.JavaClass.PRODUCT));
// Memo1.Lines.Add(JStringToString(TJBuild.JavaClass.DISPLAY));
// Memo1.Lines.Add(BluetoothLE1.GetCurrentAdapter.AdapterName);
}
end;

end.
Te cuento:
1.- Verás que hay muchas cosas inhabilitadas, porque es el mismo programa que utilizaba para probar el Modelo del dispositivo. También sobran muchas unidades en el uses.

2.- Si inhabilito el componente Bluetooth1, queda la pantalla en negro y se cierra el programa.
3.- Si habilito el componente Bluetoooth1, tengo dos posibilidades:
a) Con la propiedad Enabled := False. Al pulsar el Button1 me da "Access violation..."
b) Con la propiedad Enabled := True. Hace lo mismo que en el caso 2. Cierra el programa.

Mira si tú ves lo que me falta y me puedes ayudar. Por favor.

Gracias y un saludo.

Neftali [Germán.Estévez] 19-12-2016 18:03:07

Elimina el componente. No hace falta.
El código que te he pasado utiliza las clases directamente.

El código funciona, porque la imagen que te he pasado es mi teléfono (Android, Xiaomi MI5).

jhonalone 19-12-2016 19:08:13

Lo siento, Neftalí.
He eliminado el componente BlueTooth y no me funciona, ni en el J5 (Android MashMallow 6.0.1) que ne han regalado de 2 mano, ni en el S3 mini (Android 4.1.2) que usaba antes.
Algo estoy haciendo mal, seguro. Pero no sé que. Voy a seguir probando, pero el proyecto es tan pequeño...
que no sé por donde empezar.
Un Saludo.

jhonalone 19-12-2016 19:27:12

¡PERDONA, NEFTALÍ!
SOY UN IMBÉCIL.

Nunca dudé de tu código, por éso decía que algo me debía faltar. Era cierto. Se me había olvidado asignarle valor a la variable Adapter.

TU CÓDIGO FUNCIONA PERFECTAMENTE PARA CONSEGUIR EL NOMBRE.

MUUUUUUUUUUUY AGRADECIDO POR TU AYUDA.

Un saludo.

Neftali [Germán.Estévez] 19-12-2016 19:40:01

Cita:

Empezado por jhonalone (Mensaje 511888)
¡PERDONA, NEFTALÍ!
SOY UN IMBÉCIL.

No hay nada que perdonar.
A todos nos ha pasado alguna vez algo así. Que lo tienes delante y no lo ves... ;)


La franja horaria es GMT +2. Ahora son las 18:44:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi