1
Activity, Fragment e Intent / Re:FindViewById dalla FragmentActivity
« Ultimo post da wlf il Oggi alle 11:03 »ViewModel, se non ho capito male, è quindi una sorta di Singleton?
Hai aperto un Thread chiedendo aiuto? È stata trovata una soluzione al tuo problema?
Premi sul pulsante !
Semplificherai di molto le cose a chi fornisce supporto
e in futuro avrai maggiori possibilità di ottenere una risposta
Ho visto che ci sono alcuni siti che permettono di testate l'app prima della sua pubblicazione (utilissimi per i bug) sono affidabili?Mi fai un esempio, io non ne conosco (non ho mai cercato e quindi sono un po ' disinformato). Sinceramente non so che valore aggiunto possano darti rispetto ad un emulatore, a parte forse permettere il test su più configurazioni in un colpo solo. Cmq quando mi linki qualche esempio, faccio una veloce indagine.
Mi spiego, chi mi garantisce che poi chi testa l'app non ancora pubblicata non me la cloni e poi la pubblichi prima lui?Nessuno! Puoi prensere precauzioni e cryptare il codice dell'app; per l'affidabilità e la serietà del sito puoi solo affidarti alle opinioni che trovi in giro, ma cmq anche queste non ti garantiscono niente
Voi oltre Crashlytics o Crash Reporting et simili usate il testing vero e proprio o se ne può fare a meno?Ti direi che il test, in qulunque sua forma, è importante. Crash analytics o crash reporting non sono strumenti di test veri e propri, raccolgono informazioni sui crash della tua app per permetterti di risolvere eventuali problemi fornendoti le informazioni per potere eseguire un test mirato. Invece sono strumenti utili al test il debug o le unit test, e io sinceramente non so come qualcuno possa programmare senza fare debug o test. Non puoi farne a meno.
La pratica di acquistare recensioni positive è in uso? Ho letto la policy e il contratto ma specificatamente non è vietata (forse perchè cmq non riuscirebbero a provarla).Premesso che ognuno può fare quello che vuole, acquistare recensioni positive fa perdere di senso al sistema di recensione. In questo modo le recensioni diventerebbero solo uno specchietto per le allodole. Se vogliamo affidarci al sistema delle recensioni, dobbiamo rispettarne le regole e le logiche, e usare il buon senso che non fa mai male
Il modulo per la votazione dell'app va linkato o si può far apparire a caso da solo?Devi linkarlo, in questa risposta su SO c'è un esempio
Ho in mente di creare un'app che sia diversa per ogni nazione, non solo per la lingua, ma proprio per i contenuti, è possibile fare questo?Si, la''p uno la crea come vuole, basta inserire le logiche adeguate.
Mi spiego meglio l'app è sempre una, poi in base al paese che uno la installa i contenuti visibili saranno in parte diversi insieme alla lingua (diversi contenuti per i francesi, per i tedeschi, ecc.) ma oltre questo vorrei che durante l'installazione un utente potesse scegliere fra EU version e US version, Google consente queste cose?
Poichè si tratta di un webapp dove l'unica differenza col sito (sito che è una sorta di comparatore di prezzi) è che nell'app si può impostare la notifica push per avvisare l'utente che un determinato prodotto è di nuovo disponibile o è sceso di prezzo o ne è arrivato uno nuovo, posso aspettarmi che sia android che apple non facciano storie bocciandomela come semplicemente non vera e propria app?Non dovresti avere problemi, non sono questi i motivi per cui una app può essere esclusa dagli store, in teoria gli store non sanno come sono state fatte le app (wqebview o codice nativo o quant'altro) e credo che non gli interessi neanche.
Un ultima domanda tecnica, è fattibile bloccare la pubblicità a quegli utenti che invitano ad installare l'app ad almeno 5 amici?Non so, da un punto di vista tecnico mi verrebbe da risponderti SI
Il numero di righe corrisponde al numero di elementi di .second per cui puoi fare ubn semplice comparator:Codice (Java): [Seleziona]public class MioComparator implements Comparator<Pair<String, List<String>>> {
@Override
public int compare(Pair<String, List<String>> o1, Pair<String, List<String>> 02) {
//Da fare: Controllo dei null
return o1.second.size() - o2.second.size();
}
@Override
public boolean equals() {
//Da fare: Controllo dei null
return o1.second.size() = o2.second.size();
}
}
Inoltre ti consiglio vivamente di usare una struttura dati ad-hoc al posto di Pair<String, List<String>>:Codice (Java): [Seleziona]public class ElementoLista {
public String nomeApp;
public List<String> permessi;
}
in modo da poter accedere semplicemente a tutti gli attributi di un elemento, senza considerare che puoi aggiungere nuovi attributi in ogni istante (es. immagine dell'app):Codice (Java): [Seleziona]public class ElementoLista {
public String nomeApp;
public List<String> permessi;
public int imageResId; //Nuovo attributo
}
package com.example.mufas.eventome;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import es.dmoral.toasty.Toasty;
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!enabled) {
Toasty.error(getApplication(), "ATTIVA IL GPS", Toast.LENGTH_LONG, true).show();
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
} else {
Toasty.success(getApplication(), "GPS Attivo", Toast.LENGTH_LONG, true).show();
}
}
@Override
public void onMapReady(GoogleMap map) {
LocationManager locationManager;
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
onLocationChanged(location);
}
public void onLocationChanged(Location location) {
double latitudine = location.getLatitude();
double longitudine = location.getLongitude();
}
}
-23 15:50:16.795 12952-12952/com.example.mufas.eventome I/zzbz: Making Creator dynamically
04-23 15:50:16.805 12952-12952/com.example.mufas.eventome I/DynamiteModule: Considering local module com.google.android.gms.maps_dynamite:0 and remote module com.google.android.gms.maps_dynamite:219
Selected remote version of com.google.android.gms.maps_dynamite, version >= 219
04-23 15:50:16.904 12952-12952/com.example.mufas.eventome I/Google Maps Android API: Google Play services client version: 12451000
04-23 15:50:16.915 12952-12952/com.example.mufas.eventome I/Google Maps Android API: Google Play services package version: 12529024
04-23 15:50:17.564 12952-12998/com.example.mufas.eventome D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
04-23 15:50:17.569 12952-12952/com.example.mufas.eventome W/linker: /system/vendor/lib/hw/gralloc.clovertrail.so: unused DT entry: type 0xf arg 0x62a
/system/vendor/lib/hw/gralloc.clovertrail.so: is missing DT_SONAME will use basename as a replacement: "gralloc.clovertrail.so"
04-23 15:50:17.570 12952-12952/com.example.mufas.eventome W/linker: /system/vendor/lib/libpvr2d.so: unused DT entry: type 0xf arg 0x79b
/system/vendor/lib/libpvr2d.so: is missing DT_SONAME will use basename as a replacement: "libpvr2d.so"
04-23 15:50:17.571 12952-12952/com.example.mufas.eventome W/linker: /system/vendor/lib/hw/gralloc.clovertrail.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
04-23 15:50:17.572 12952-12952/com.example.mufas.eventome W/linker: /system/vendor/lib/libpvr2d.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
04-23 15:50:17.573 12952-12952/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 53
04-23 15:50:17.574 12952-12952/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 54
:0: PVRDRMOpen: TP3, ret = 54
:0: PVRDRMOpen: TP3, ret = 54
04-23 15:50:17.598 12952-12952/com.example.mufas.eventome D/AndroidRuntime: Shutting down VM
04-23 15:50:17.606 12952-12952/com.example.mufas.eventome E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mufas.eventome, PID: 12952
java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at com.example.mufas.eventome.MainActivity.onLocationChanged(MainActivity.java:73)
at com.example.mufas.eventome.MainActivity.onMapReady(MainActivity.java:66)
at com.google.android.gms.maps.zzak.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzaq.dispatchTransaction(Unknown Source)
at com.google.android.gms.internal.maps.zzb.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:387)
at fh.b(:com.google.android.gms.dynamite_dynamitemodulesb@12529024@12.5.29 (040700-192802242):20)
at com.google.android.gms.maps.internal.bg.a(:com.google.android.gms.dynamite_dynamitemodulesb@12529024@12.5.29 (040700-192802242):5)
at com.google.maps.api.android.lib6.impl.be.run(:com.google.android.gms.dynamite_dynamitemodulesb@12529024@12.5.29 (040700-192802242):5)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-23 15:50:19.538 12952-12996/com.example.mufas.eventome W/DynamiteModule: Local module descriptor class for com.google.android.gms.googlecertificates not found.
04-23 15:50:19.547 12952-12996/com.example.mufas.eventome I/DynamiteModule: Considering local module com.google.android.gms.googlecertificates:0 and remote module com.google.android.gms.googlecertificates:4
Selected remote version of com.google.android.gms.googlecertificates, version >= 4
04-23 15:50:19.551 12952-12996/com.example.mufas.eventome W/System: ClassLoader referenced unknown path: /data/data/com.google.android.gms/app_chimera/m/00000011/n/x86
04-23 15:50:19.605 12952-12996/com.example.mufas.eventome W/PhenotypeFlag: Bypass reading Phenotype values for flag: LogSampling__MAPS_API
04-23 15:50:19.610 12952-12996/com.example.mufas.eventome W/PhenotypeFlag: Bypass reading Phenotype values for flag: LogSampling__MAPS_API
04-23 15:50:20.092 12952-12952/com.example.mufas.eventome I/Process: Sending signal. PID: 12952 SIG: 9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mufas.eventome">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="...................................................." />
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
</manifest>
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyAsyWRjG-r76pgWC3hW-3w8_H8wlRBtcZA" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="API_KEY" />
public class MioComparator implements Comparator<Pair<String, List<String>>> {
@Override
public int compare(Pair<String, List<String>> o1, Pair<String, List<String>> 02) {
//Da fare: Controllo dei null
return o1.second.size() - o2.second.size();
}
@Override
public boolean equals() {
//Da fare: Controllo dei null
return o1.second.size() = o2.second.size();
}
}
public class ElementoLista {
public String nomeApp;
public List<String> permessi;
}
public class ElementoLista {
public String nomeApp;
public List<String> permessi;
public int imageResId; //Nuovo attributo
}