Post recenti

Pagine: [1] 2 3 ... 10
1
Mappe e Geolocalizzazione / Inserimento Mappa in app
« Ultimo post da mufasaonline il Ieri alle 17:07 »
Ciao sto provando ad implementare una mappa in un app facendo riferimengto alle api di Google:
https://developers.google.com/maps/documentation/android-api/map-with-marker[/url]

Il problema è che appena lancio l'app mi appare il riquadro in grigio con il logo Google ma la mappa non si vede, di seguito codice:

Manifest.xml

Codice (Java): [Seleziona]
<?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.maps.v2.API_KEY"
            android:value="AIzaSyAsyWRjG-r76pgWC3hW-3w8_H8wlRBtcZA" />
    </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>

MainActivity.java

Codice (Java): [Seleziona]
package com.example.mufas.eventome;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

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);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

        LatLng sydney = new LatLng(-33.852, 151.211);
        googleMap.addMarker(new MarkerOptions().position(sydney)
                .title("Marker in Sydney"));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

}

Activity_main

Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="[url]http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        tools:context=".MapsActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment" />


</android.support.constraint.ConstraintLayout>

Questo invece il Logat al momento in cui lancio l app...

Codice (Java): [Seleziona]
04-21 17:06:16.144 20327-20327/? I/art: Late-enabling -Xcheck:jni
04-21 17:06:16.309 20327-20327/com.example.mufas.eventome W/System: ClassLoader referenced unknown path: /data/app/com.example.mufas.eventome-2/lib/x86
04-21 17:06:16.454 20327-20327/com.example.mufas.eventome W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-21 17:06:16.640 20327-20337/com.example.mufas.eventome I/art: Background partial concurrent mark sweep GC freed 1297(243KB) AllocSpace objects, 0(0B) LOS objects, 52% free, 937KB/1961KB, paused 9.554ms total 34.847ms
04-21 17:06:16.666 20327-20327/com.example.mufas.eventome I/zzbz: Making Creator dynamically
04-21 17:06:16.687 20327-20327/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
04-21 17:06:16.688 20327-20327/com.example.mufas.eventome I/DynamiteModule: Selected remote version of com.google.android.gms.maps_dynamite, version >= 219
04-21 17:06:16.801 20327-20327/com.example.mufas.eventome I/Google Maps Android API: Google Play services client version: 12451000
04-21 17:06:16.821 20327-20327/com.example.mufas.eventome I/Google Maps Android API: Google Play services package version: 12529024
04-21 17:06:17.478 20327-20372/com.example.mufas.eventome D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
04-21 17:06:17.477 20327-20327/com.example.mufas.eventome I/.mufas.eventome: type=1400 audit(0.0:391): avc: denied { open } for name="card0" dev="tmpfs" ino=343 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1
    type=1400 audit(0.0:392): avc: denied { getattr } for path="/dev/dri/card0" dev="tmpfs" ino=343 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1
04-21 17:06:17.483 20327-20327/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-21 17:06:17.484 20327-20327/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-21 17:06:17.485 20327-20327/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-21 17:06:17.486 20327-20327/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-21 17:06:17.487 20327-20327/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 53
    :0: PVRDRMOpen: TP3, ret = 54
04-21 17:06:17.488 20327-20327/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 54
    :0: PVRDRMOpen: TP3, ret = 54
04-21 17:06:17.605 20327-20372/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 51
04-21 17:06:17.607 20327-20372/com.example.mufas.eventome E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 58
04-21 17:06:17.611 20327-20372/com.example.mufas.eventome I/OpenGLRenderer: Initialized EGL, version 1.4
04-21 17:06:17.611 20327-20372/com.example.mufas.eventome W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-21 17:06:17.615 20327-20372/com.example.mufas.eventome W/linker: /system/vendor/lib/libPVROCL.so: unused DT entry: type 0xf arg 0x9fd
    /system/vendor/lib/libPVROCL.so: is missing DT_SONAME will use basename as a replacement: "libPVROCL.so"
    /system/vendor/lib/libPVROCL.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
04-21 17:06:18.040 20327-20373/com.example.mufas.eventome E/Google Maps Android API: Authorization failure.  Please see https://developers.google.com/maps/documentation/android-api/start for how to correctly set up the map.
04-21 17:06:18.046 20327-20373/com.example.mufas.eventome E/Google Maps Android API: In the Google Developer Console (https://console.developers.google.com)
    Ensure that the "Google Maps Android API v2" is enabled.
    Ensure that the following Android Key exists:
        API Key: A...........................................................................
        Android Application (<cert_fingerprint>;<package_name>): 64:80:92:A8:62:C1:4F:F1:E7:BE:70:32:2F:9C:BF:BF:C2:D9:2F:E6;com.example.mufas.eventome
04-21 17:06:19.414 20327-20370/com.example.mufas.eventome W/DynamiteModule: Local module descriptor class for com.google.android.gms.googlecertificates not found.
04-21 17:06:19.425 20327-20370/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-21 17:06:19.434 20327-20370/com.example.mufas.eventome W/System: ClassLoader referenced unknown path: /data/data/com.google.android.gms/app_chimera/m/00000011/n/x86
04-21 17:06:19.488 20327-20370/com.example.mufas.eventome W/PhenotypeFlag: Bypass reading Phenotype values for flag: LogSampling__MAPS_API
04-21 17:06:19.492 20327-20370/com.example.mufas.eventome W/PhenotypeFlag: Bypass reading Phenotype values for flag: LogSampling__MAPS_API
    Bypass reading Phenotype values for flag: LogSampling__MAPS_API
04-21 17:06:19.493 20327-20370/com.example.mufas.eventome W/PhenotypeFlag: Bypass reading Phenotype values for flag: LogSampling__MAPS_API
    Bypass reading Phenotype values for flag: LogSampling__MAPS_API
    Bypass reading Phenotype values for flag: LogSampling__MAPS_API

Cosa sto sbagliando? Un saluto a tutto il forum... Siete grandi!!!
2
Wouuuu....
Un'illustrazione a dir poco eccellente :(
Dai non si capisce nulla (o quasi nulla) dalla tua richiesta.
Se cerchi di essere un pò più specifico vedrai che la soluzione si trova, in pratica potresti non aver bisogno di un Comparator personalizzato, potresti fare tutto on una map (Lambda) e passare all'adapter una list già ordinata.
3
Buonasera
Sto cercando di ordinare una listview in base al valore di un elemento che si ricava da un elemento del "pair", cioè il numero di linee di "item.second".
Il problema è che non riesco a creare un "Comparator" adatto ad ordinare un elemento che esiste nell'activity dell'adapter, ma non esiste nella MainActivity né nell'adapter in sé.
Ecco il codice dell'adapter:
Codice (Java): [Seleziona]
class AppsAdapter extends BaseAdapter{

    private Context mContext;
    private List<Pair<String, List<String>>> mAppsWithPermission;


    AppsAdapter(Context context, List<Pair<String, List<String>>> appsWithPermission) {
        mContext = context;
        mAppsWithPermission = appsWithPermission;
    }

    static class ViewHolder {
        TextView appName;
        TextView appPermissions;
        ImageView appIcon;
        TextView Lines;
        }

    @Override
    public int getCount() {
        return mAppsWithPermission.size();
    }

    @Override
    public Object getItem(int position) {
        return mAppsWithPermission.get(position);
    }

    @Override
    public long getItemId(int position) {
        return mAppsWithPermission.get(position).hashCode();
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            holder.appName = convertView.findViewById(R.id.list_item_appname);
            holder.appPermissions = convertView.findViewById(R.id.list_item_apppermissions);
            holder.appIcon = convertView.findViewById(R.id.list_item_appicon);
            holder.Lines = convertView.findViewById(R.id.list_item_lines);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final Pair<String, List<String>> item = mAppsWithPermission.get(position);

        final PackageManager packageManager = mContext.getPackageManager();
        String mAppPer = item.second.toString();

        int lineCount = holder.appPermissions.getLineCount();
        Log.v("LINE_NUMBERS", lineCount+"");

        String strI = Integer.toString(lineCount);
        holder.Lines.setText(strI);

        if (mAppPer.matches("")) {
        holder.Lines.setText("0");
        }

        });
    return convertView;
    }
    }

Mi potreste dare una mano? Sto cercando di ordinare l'intero adapter per il valore decrescente di "lineCount" se necessitate Int o di "StrI" se necessitate di String. Purtroppo non posso modificare il "Pair" perché dovrei praticamente rifare l'app...
Grazie mille!
F
4
View e Layout / Re:NestedScrollView & header
« Ultimo post da wlf il 20 Aprile 2018, 09:58:57 CEST »
No, ma l'ho messo anche dentro a Toolbar; quando mi collassa oltre una certa percentuale faccio sparire il linearLayoutHeader e faccio comparire lo stesso dentro alla Toolbar. In questo modo riesco a farlo rimanere.

Tu invece dici di piazzarlo nella CollapsingToolbarLayout sotto la ImageView come elemento fisso?
 
5
Richiesta Tutorial / Re:App per lancio widget
« Ultimo post da arturob il 19 Aprile 2018, 23:20:18 CEST »
2.1
hai ragione per quanto riguarda il significato di widget, che in pratica io lo  vedo, come dici tu, un "shortcut intelligente".  Ho sbaglato verbo, forse dovevo dire "Cliccata", "Selezionata", ...
spiego cosa intendo con un esempio pratico:
- push prolungato su una parte vuota dello schermo smartphone
- appare una pagina in cui posso selezionare "sfondi",  "widget" ed "Impostazioni", ... scelgo "widget"
- Avendo installato l'app di Fibaro, mi permette di selezionare uno dei relativi widget ... io scelgo "Scene", subito mi appaiono tutte le scene che ho memorizzato sul controller "Home Center 2"  e seleziono quella che intendo far partire quando premo/clicco il widget appena creato.

Per quanto riguarda le scene in Lua, sono memorizzate sul controller "Home Center 2" non sul cellulare.
Allo scopo di chiarire meglio il concetto,  ti copio sotto un esempio di scena, scritta in Lua per il controllo del livello batterie dei dispositivi non collegati alla rete elettrica, che, ripeto, si crea e si memorizza sul controller domotico "Home Center 2":
Codice: [Seleziona]
--[[
%% properties
%% events
%% globals
--]]

if   (fibaro:countScenes() > 1) then fibaro:abort()       
end

local DestinatariMsg         = 'Arturo--------------------------------------------'
local LivelloMinBatteria = 20
local MaxId = 1000

for Id = 1, MaxId do
          local LivelloBatteria = fibaro:get(Id, 'batteryLevel')
                if LivelloBatteria ~= nil and LivelloBatteria > ' ' then
                      local Nome = fibaro:getName(Id)
                      local Camera = fibaro:getRoomNameByDeviceID(Id)
                    local Nome_e_Camera = Nome .. Camera
                              if tonumber(LivelloBatteria) <= LivelloMinBatteria and Camera ~= 'unassigned' and Nome_e_Camera ~= Nome_e_Camera1 then
                                                TestoMsg = 'ATTENZIONE! ' .. Nome .. ' (' .. Camera .. ') / LIVELLO BATTERIE AL LIMITE: '..LivelloBatteria..' %'
                                        fibaro:setGlobal('Vg_MsgPush' ,DestinatariMsg .. TestoMsg)
                                    elseif Camera ~= 'unassigned' and Nome_e_Camera ~= Nome_e_Camera1 then
                                                TestoMsg = Nome .. ' (' .. Camera .. ') / livello Batterie: '..LivelloBatteria ..' %'
                                                fibaro:setGlobal('Vg_MsgPush' ,DestinatariMsg .. TestoMsg)                       
                            end
        local Nome_e_Camera1 = Nome .. Camera
                   end
end

2.2
si hai ragione, ho dimenticato la costante "avvia"


4
Da quello che so io, non puoi inviare comandi vocali da Smartphone al controller, l'unico modo è passare da un widget, avviato da google assistant a mezzo di una App, in quanto, come dicevo sopra, google assistant permette di avviare App ma non attivare widget.
   
Come dici te, google assistant  è un software disponibile dalla 6.0 di android in su, mentre Google Home è un dispositivo hardware che colloquia con il controller. In questa pagina puoi verificare te stesso:   http://www.zwave-community.it/topic/672-google-home-italiano-home-center-2/   

ciao
6
Richiesta Tutorial / Re:App per lancio widget
« Ultimo post da Ohmnibus il 19 Aprile 2018, 22:16:59 CEST »
1 - Non lo so, direi che dipende dal dispositivo

2.1 - Stai usando una terminologia che non conosco. Nel mondo android un widget è una app speciale che vive nella home del dispositivo e non può essere lanciata (anzi di solito è lei che lancia altre app - di fatto è una sorta di "shortcut intelligente"). Le "scene in lua" non ho idea di cosa siano. Dato che da quel poco che so android non supporta nativamente Lua immagino ci sia un'app che funge da emulatore/interprete. Questa è la "terza app" di cui parlo (le altre due sono "MiaApp" e "Google Assistant" che intercetta "Ok Google")

2.2 - No, come ti ho detto il flusso è il seguente:

"Ok Google, avvia MiaApp" -> MiaApp si avvia e si mette in ascolto -> "Apri portone" -> MiaApp riconosce il comando ed apre il portone

Quindi secondo i tuoi esempi dovrebbe essere

                                 App             Comando
"Ok google, avvia     per favore    apri portone"

3 - Capisco.
4 - Nella pagina dell'app (questa) è indicato

Citazione
After a few years of faithful service, we have decided to retire Lili - our voice assistant, to make way for Google Assistant and Amazon Alexa.

quindi se non ho capito male si parla di Google Assistant, che è un'app, non di Google Home. Davo per scontato che fosse possibile dare il comando anche dal Google Assistant installato sul dispositivo, puoi confermare/smentire?
7
Richiesta Tutorial / Re:App per lancio widget
« Ultimo post da arturob il 19 Aprile 2018, 21:51:20 CEST »
grazie per la risposta Ohmnibus,  faccio seguire le mie osservazioni, ben separate in modo che siano più comprensibili possibile:

>> ..... MiaApp si avvia e si mette in ascolto ....
Domanda: quanto impiega l'app a mettersi in ascolto ? permette una frase contigua od occorre aspettare qualche secondo fra l'avvio dell'app e la pronuncia del widget da lanciare ?

>>  .... "Apri Portone" è un comando qualsiasi riconosciuto da MiaApp ed il comando per aprire il portone può essere ovviamente indirizzato ad una terza app.
Non ho ben capito se soddisfa o meno lo scopo finale!   Alla fine "MiaApp" deve avviare solamente il widget "Apri Portone", non avviare una terza app. L'avvio del widget mi fa partire una scena in Lua memorizzata sul Controller, che apre il portone.

In caso le note sopra esposte, ricevessero una risposta positiva, mi immaginerei una operatività come segue:
                       App                 Widget
"Ok google,   per favore     accendi luce cucina"
"Ok google,   per favore     spegni luce Camera da letto"
"Ok google,   per favore     attiva Allarme"
"Ok google,   per favore     posticipa allarme 30 minuti"
"Ok google,   per favore     abbassa tapparelle soggiorno"     
"Ok google,   per favore     imposta 20 gradi in zona giorno"
"Ok google,   per favore     apri il portone"
 

>> Qui i dettagli sul riconoscimento dei comandi vocali: .....
Io sono totalmente digiuno di questo linguaggio di programmazione, faccio solamente qualcosa in Lua per crearmi delle scena sul controller, e qualche script dos ... per lavoro.
è per questo che chiedevo se qualcuno aveva le conoscenze tecniche per creare una app che se ben funzionante, farebbe gola a molti possessori di Controller domotici, non solo Fibaro .... ;-)   

>> l'app di Fibaro non accetta già i comandi vocali?
- l'app fibaro aveva comando vocali gestiti da "Lilli" ma con l'ultima release lo hanno tolto, in più parlava solo inglese ....

Ad oggi, che sappia io, compatibili con il controller Home Centre 2 di Fibaro ci sono solo "Google Home" ed "Eco dot con  Alexa", ma secondo me hanno il difetto di dover andare accanto a loro per pronunciare il comando, mentre con lo smartphone, puoi addirittura impartire comandi da fuori Lan.
 
ciao e grazie ancora per l'attenzione.
Arturo 
 
8
Altri problemi / short link
« Ultimo post da d4®io il 19 Aprile 2018, 12:54:41 CEST »
Ciao,
se ho un “mio” server e volessi creare degli short link per aggiornare i dati (ogni tot giorni) come faccio adesso che Google ha deciso di eliminare il servizio gratuito? Conoscete alternative funzionali? Ho provato con → tynee Link Shortener - Shorten those ugly URLs into tiny links
ma l'applicazione crasha, non so bene per quale motivo, so solo che i vecchi link creati con il tool gratuito di Google funzionano (ancora per un anno).

Aggiungo che non mi serve l’indicizzazione da parte di un qualche motore di ricerca, niente spider, la directory è privata perché sono dati utili per l’applicazione.

Qualche idea?
9
View e Layout / Re:Multipli Layout
« Ultimo post da Ohmnibus il 19 Aprile 2018, 10:23:20 CEST »
Per non impazzire con i findviewbyid ti consiglio di attivare il DataBinding:

Data Binding Library

in particolare il paragrafo

Generated Binding

Dai priorità all'argomento per risparmiare tempo prezioso
10
View e Layout / Re:Multipli Layout
« Ultimo post da luca45 il 19 Aprile 2018, 10:00:10 CEST »
Grazie per la celere risposta.
Per quanto riguarda il mio metodo ho risolto invocando sul click del tasto la possibilità di rendere visibile o meno la griglia desiderata con chiaramente un uso massivo di findViewById.
Ora stò provando il tuo metodo.
Pagine: [1] 2 3 ... 10