是否可以初始化对象文字并同时使用只读属性声明其接口?
例如
let a = { readonly b: 2, readonly c: 3 }
答案 0 :(得分:1)
您可以使用package com.rot.rot;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.Identifier;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* App main activity, gestiona la detección de beacons, mostrando un mensaje de los beacons
* detectados
*
* @author David González Verdugo
*/
public class BLE_Service extends AppCompatActivity implements View.OnClickListener, BeaconConsumer,
RangeNotifier {
protected final String TAG = BLE_Service.this.getClass().getSimpleName();;
private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;
private static final int REQUEST_ENABLE_BLUETOOTH = 1;
//private static final long DEFAULT_SCAN_PERIOD_MS = 6000l;
private static final String ALL_BEACONS_REGION = "AllBeaconsRegion";
//COn los dos variable ssiguientes conseguimos que este escaneando el 100% del tiempo
private static final int SCAN_MODE_LOW_LATENCY_WINDOW_MS = 4096;
private static final int SCAN_MODE_LOW_LATENCY_INTERVAL_MS = 4096;
// Para interactuar con los beacons desde una actividad
private BeaconManager mBeaconManager;
// Representa el criterio de campos con los que buscar beacons
private Region mRegion;
private Button btn_start, btn_stop;
private TextView textView;
private BroadcastReceiver broadcastReceiver;
private BroadcastReceiver broadcastReceiverBLE;
int contadordedatosenviados=0;
RequestQueue queue;
JsonObjectRequest request;
Map<String, String> map = new HashMap<String, String>();
String Usuario; // Variable usuario para utilizar durante el fichero
String Nom_Carrera;
String latitud;
String longitud;
ArrayList<String> memoriacorredores = new ArrayList<String>();
@Override
protected void onResume() {
super.onResume();
if(broadcastReceiver == null){
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//textView.append("\n" +intent.getExtras().get("coordinates"));
String sIntent = ""+intent.getExtras().get("coordinates");
String lat=sIntent.split(" ")[1];
String lon=sIntent.split(" ")[0];
TextView latit = (TextView)findViewById(R.id.Latitud);
latit.setText("Latitud: "+lat);
TextView longt = (TextView)findViewById(R.id.Longitud);
longt.setText("Longitud: "+lon);
latitud=lat;
longitud=lon;
}
};
}
if(broadcastReceiverBLE == null){
broadcastReceiverBLE = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
alertmessageLogin(55);
}
};
}
registerReceiver(broadcastReceiver,new IntentFilter("location_update"));
registerReceiver(broadcastReceiverBLE,new IntentFilter("BLE_update"));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ble_service);
getStartButton().setOnClickListener(this);
getStopButton().setOnClickListener(this);
mBeaconManager = BeaconManager.getInstanceForApplication(this);
// Fijar un protocolo beacon, Eddystone en este caso
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
// Y aqui el parser para otro tipo de beacons como ibeacons
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
// Detect the Eddystone telemetry (TLM) frame:
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15"));
// Detect the Eddystone URL frame:
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v"));
ArrayList<Identifier> identifiers = new ArrayList<>();
mRegion = new Region(ALL_BEACONS_REGION, identifiers);
getSupportActionBar().hide();//<!-- Para que no salga la barra superior en todas las activitis-->
Bundle p = getIntent().getExtras();
String usu = p.getString("EXTRA_SESSION_USER");
String car = p.getString("EXTRA_SESSION_USER2");
Usuario = usu;
Nom_Carrera = car;
memoriacorredores.add("inicializacion");
btn_start = (Button) findViewById(R.id.button);
btn_stop = (Button) findViewById(R.id.button2);
//textView = (TextView) findViewById(R.id.textView);
if (!runtime_permissions())
enable_buttons();
}
@Override
public void onClick(View view) {
if (view.equals(findViewById(R.id.startReadingBeaconsButton))) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Si los permisos de localización todavía no se han concedido, solicitarlos
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
askForLocationPermissions();
} else { // Permisos de localización concedidos
prepareDetection();
}
} else { // Versiones de Android < 6
prepareDetection();
}
} else if (view.equals(findViewById(R.id.stopReadingBeaconsButton))) {
stopDetectingBeacons();
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// Desactivar bluetooth
if (mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.disable();
}
}
}
/**
* Activar localización y bluetooth para empezar a detectar beacons
*/
private void prepareDetection() {
if (!isLocationEnabled()) {
askToTurnOnLocation();
} else { // Localización activada, comprobemos el bluetooth
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
showToastMessage(getString(R.string.not_support_bluetooth_msg));
} else if (mBluetoothAdapter.isEnabled()) {
startDetectingBeacons();
} else {
// Pedir al usuario que active el bluetooth
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BLUETOOTH);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_BLUETOOTH) {
// Usuario ha activado el bluetooth
if (resultCode == RESULT_OK) {
startDetectingBeacons();
} else if (resultCode == RESULT_CANCELED) { // User refuses to enable bluetooth
showToastMessage(getString(R.string.no_bluetooth_msg));
}
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* Empezar a detectar los beacons, ocultando o mostrando los botones correspondientes
*/
private void startDetectingBeacons() {
// Fijar un periodo de escaneo
//mBeaconManager.setForegroundScanPeriod(DEFAULT_SCAN_PERIOD_MS);
mBeaconManager.setForegroundScanPeriod(SCAN_MODE_LOW_LATENCY_WINDOW_MS);
mBeaconManager.setForegroundBetweenScanPeriod(SCAN_MODE_LOW_LATENCY_INTERVAL_MS);
// Enlazar al servicio de beacons. Obtiene un callback cuando esté listo para ser usado
mBeaconManager.bind(this);
// Desactivar botón de comenzar
getStartButton().setEnabled(false);
getStartButton().setAlpha(.5f);
// Activar botón de parar
getStopButton().setEnabled(true);
getStopButton().setAlpha(1);
}
@Override
public void onBeaconServiceConnect() {
try {
// Empezar a buscar los beacons que encajen con el el objeto Región pasado, incluyendo
// actualizaciones en la distancia estimada
mBeaconManager.startRangingBeaconsInRegion(mRegion);
showToastMessage(getString(R.string.start_looking_for_beacons));
} catch (RemoteException e) {
Log.d(TAG, "Se ha producido una excepción al empezar a buscar beacons " + e.getMessage());
}
mBeaconManager.addRangeNotifier(this);
}
/**
* Método llamado cada DEFAULT_SCAN_PERIOD_MS segundos con los beacons detectados durante ese
* periodo
*/
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() == 0) {
showToastMessage(getString(R.string.no_beacons_detected));
}
for (Beacon beacon : beacons) {
if (beacon.getServiceUuid() == 0xfeaa) {// Aquí entraria en caso de Edystone
// This is Eddystone, which uses a service Uuid of 0xfeaa
Identifier eddystoneNamespaceId = beacon.getId1();
Identifier eddystoneInstanceId = beacon.getId2();
//Identifier eddystoneInstanceId3 = beacon.getId3(); NO tine id 3 eddystone
showToastMessage(getString(R.string.beacon_detected, beacon.getId2()));
}
else{// NE el caso de otro parse como por ejemplo ibeacon
showToastMessage(getString(R.string.beacon_detected, beacon.getBluetoothName()));
}
try {
enviardato(String.valueOf(beacon.getId3()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void stopDetectingBeacons() {
try {
mBeaconManager.stopMonitoringBeaconsInRegion(mRegion);
showToastMessage(getString(R.string.stop_looking_for_beacons));
} catch (RemoteException e) {
Log.d(TAG, "Se ha producido una excepción al parar de buscar beacons " + e.getMessage());
}
mBeaconManager.removeAllRangeNotifiers();
// Desenlazar servicio de beacons
mBeaconManager.unbind(this);
// Activar botón de comenzar
getStartButton().setEnabled(true);
getStartButton().setAlpha(1);
// Desactivar botón de parar
getStopButton().setEnabled(false);
getStopButton().setAlpha(.5f);
}
/**
* Comprobar permisión de localización para Android >= M
*/
private void askForLocationPermissions() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.location_access_needed);
builder.setMessage(R.string.grant_location_access);
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_COARSE_LOCATION: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
prepareDetection();
} else {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.funcionality_limited);
builder.setMessage(getString(R.string.location_not_granted) +
getString(R.string.cannot_discover_beacons));
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
builder.show();
}
return;
}
}
}
public void onRequestPermissionsResult2(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100){
if( grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
enable_buttons();
}else {
runtime_permissions();
}
}
}
/**
* Comprobar si la localización está activada
*
* @return true si la localización esta activada, false en caso contrario
*/
private boolean isLocationEnabled() {
LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
boolean networkLocationEnabled = false;
boolean gpsLocationEnabled = false;
try {
networkLocationEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
gpsLocationEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
Log.d(TAG, "Excepción al obtener información de localización");
}
return networkLocationEnabled || gpsLocationEnabled;
}
/**
* Abrir ajustes de localización para que el usuario pueda activar los servicios de localización
*/
private void askToTurnOnLocation() {
// Notificar al usuario
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage(R.string.location_disabled);
dialog.setPositiveButton(R.string.location_settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
// TODO Auto-generated method stub
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
}
});
dialog.show();
}
private Button getStartButton() {
return (Button) findViewById(R.id.startReadingBeaconsButton);
}
private Button getStopButton() {
return (Button) findViewById(R.id.stopReadingBeaconsButton);
}
/**
* Mostrar mensaje
*
* @param message mensaje a enseñar
*/
private void showToastMessage (String message) {
Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
public void enviardato(String identificador) throws IOException {
//Actualizamos numeor de datos enviados
//contadordedatosenviados=contadordedatosenviados+1;
String IDcorredor=identificador;
//Comprovamos que no ha enviado un dato con ese mismo id, ya que un mismo voluntario solo debe cojer le dato de un mismo corroedor. Es una forma de tener una memeoria
if(identificador.equals("6105")){
int c;
int res=0;
int resneg=0;
for(c=0;c<memoriacorredores.size();c++){
if(memoriacorredores.get(c).equals(IDcorredor)){
res++;
}
else{
resneg++;
}
}
if (res!=0){
alertmessageLogin(8);
return;
}
//Actualizamos numeor de datos enviados
contadordedatosenviados=contadordedatosenviados+1;
memoriacorredores.add(IDcorredor);
IDcorredor="1";//conversion al actual id
}
if(identificador.equals("27720")){
int c;
int res=0;
int resneg=0;
for(c=0;c<memoriacorredores.size();c++){
if(memoriacorredores.get(c).equals(IDcorredor)){
res++;
}
else{
resneg++;
}
}
if (res!=0){
alertmessageLogin(8);
return;
}
//Actualizamos numeor de datos enviados
contadordedatosenviados=contadordedatosenviados+1;
memoriacorredores.add(IDcorredor);
IDcorredor="2";//conversion al actual id
}
TextView Numero = (TextView)findViewById(R.id.numerodeenvios);
Numero.setText(String.valueOf(contadordedatosenviados));//Como el textview solo muestra string hay que pasar el integer a string
// Creamos la cola de Peticiones/Solicitudes
queue = Volley.newRequestQueue(this);
// Los parametros para el php, hacemos el mapping para poder pasarlo a JSON
// map.put(KEY, VALUE);
map.put("unameV", Usuario);
map.put("latitud", latitud);
map.put("longitud", longitud);
map.put("nomcarrera", Nom_Carrera);
map.put("IDCorredor", IDcorredor); //Lo recibimos por BLE
String url="http://"+getResources().getString(R.string.ip_server_Login)+"/InsertarDato_APP.php"; // Cremos la variable url para que se edite automaticamente desde el fichero Strings
// La solicitud JSON
// JsonObjectRequest(METHOD, URL, JSONOBJECT(PARAMETERS), OK_LISTENER, ERROR_LISTENER);
request = new JsonObjectRequest(
Request.Method.POST, // the request method
//getResources().getString(R.string.meatShootingMessage, numPoundsMeat);
//"http://192.168.43.84:8080/check-login_APP_voluntarios.php", // the URL
url,
new JSONObject(map), // the parameters for the php
new Response.Listener<JSONObject>() { // the response listener
@Override
public void onResponse(JSONObject response){
// Aquí parseamos la respuesta
Log.d("Response", String.valueOf(response));
// Aquí parseamos la respuesta
JSONObject myJson = response;
String resp = null;
try { //Comprovamos la respuesta recivida del server
resp = myJson.getString("res");
if(resp.equals("OK")) {//Se ha inciado sesion corectamente
//alertmessageLogin(1);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() { // the error listener
@Override
public void onErrorResponse(VolleyError error) { // En caso de error con la conexon con el server entrariamos en esta parte del codigo
alertmessageLogin(4);
}
});
// Ejecutamos la solicitud para btener la informcion en formato JSON
queue.add(request);
}
@Override
protected void onDestroy() {
super.onDestroy();
mBeaconManager.removeAllRangeNotifiers();
mBeaconManager.unbind(this);
if(broadcastReceiver != null){
unregisterReceiver(broadcastReceiver);
}
}
private void enable_buttons() {
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i =new Intent(getApplicationContext(),GPS_Service.class);
startService(i);
Intent ble =new Intent(getApplicationContext(),BLE_Service.class);
startService(ble);
}
});
btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),GPS_Service.class);
stopService(i);
Intent ble = new Intent(getApplicationContext(),BLE_Service.class);
stopService(ble);
}
});
}
private boolean runtime_permissions() {
if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},100);
return true;
}
return false;
}
public void alertmessageLogin(int a){ // Función donde creamos todos los alert necesarios
// make a handler that throws a runtime exception when a message is received
final Handler handler = new Handler() {
public void handleMessage(Message mesg) {
throw new RuntimeException();
}
};
// make a text input dialog and show it
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Datos:"); // El titulo de todos los alert es el nombre de la ativity
//Dependiendo del valor de a saltara un activity diferente
if (a==1){
builder.setMessage("Dato insertado correctamente");
}
if (a==4){
builder.setMessage("ESTA APLICACION REQUIERE CONEXION CON EL SERVIDOR PARA FUNCIONAR. ASEGURESE DE TENERLA.");
}
if (a==8){
builder.setMessage("Este identificador ya ha registrado un dato.");
}
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
handler.sendMessage(handler.obtainMessage());
}
});
builder.show(); // Mostramos el alert
// loop till a runtime exception is triggered.
try { Looper.loop(); }
catch(RuntimeException e2) {}
}
}
断言:
as const
如果只希望某些道具是只读的,那是不可能的,最好的办法是使用let a = { b: 2, c: 3 } as const // typed as { readonly b: 2; readonly c: 3; }
a.b = 2 //Cannot assign to 'b' because it is a read-only property.
,其中一部分包含只读属性,另一部分包含可变属性:
Object.assign
答案 1 :(得分:-2)
您可以使用自定义类型编写
type Point = {
readonly x: number;
readonly y: number;
};
const a: Point = {
x: 1,
y: 2,
};
a.x = 2; // ERROR Cannot assign to 'x' because it is a constant or a read-only property.