Poly API: 3D-varade hankimine VR- ja AR-Androidi rakenduste jaoks

Autor: Peter Berry
Loomise Kuupäev: 14 August 2021
Värskenduse Kuupäev: 8 Mai 2024
Anonim
Poly API: 3D-varade hankimine VR- ja AR-Androidi rakenduste jaoks - Rakendused
Poly API: 3D-varade hankimine VR- ja AR-Androidi rakenduste jaoks - Rakendused

Sisu


Kas teil on suurepärane idee virtuaalse reaalsuse (VR) või liitreaalsuse (AR) mobiilirakenduseks, kuid pole aimugi, kuidas oma visiooni ellu viia?

Kui te pole Androidi arendaja, kes on ka kogenud 3D-kunstnik, võib kõigi kaasahaarava, 360-kraadise kogemuse pakkumiseks vajalike varade loomine olla hirmutav protsess.

Ainult sellepärast, et teil pole 3D-mudelite loomiseks vajalikku aega, ressursse ega kogemusi, ei ole tähendab, et te ei saa ehitada suurepärast VR- või AR-mobiilirakendust! Internetis on vabalt saadaval tohutu hulk 3D-ressursse, lisaks kõik API-d, raamistikud ja teegid, mida peate nende varade allalaadimiseks ja Androidi rakendustes renderdamiseks.

Loe edasi: Nüüd saate Daydream VR-i abil külastada mis tahes veebisaite. Isegi seda.

Selles artiklis käsitleme veebipõhist repositooriumi Poly ja API-sid, mis seisavad tuhandete 3D-varade käeulatuses. Selle artikli lõpuks olete loonud rakenduse, mis hangib 3D Poly vara käitusel ja seejärel renderdab selle populaarse Androidi teegi Processing for Android.


3D-vara kuvamine rakendusega Poly

Kui olete kunagi Unity arendamisel segadusse sattunud, sarnaneb Poly-varamu Unity Asset Store'iga - välja arvatud see, et Poly-s on kõik tasuta!

Paljud Poly 3D-mudelid on avaldatud Creative Commonsi litsentsi alusel, nii et kui te loojale sobivat krediiti annate, saate neid varasid kasutada, muuta ja remiksida.

Kõik Poly'i 3D-mudelid on loodud ühilduvaks Google'i VR- ja AR-platvormidega, näiteks Daydream ja ARCore, kuid saate neid kasutada kõikjal ja igal pool, kus soovite - potentsiaalselt võite neid kasutada isegi Apple'i ARKitiga!

Mitme vara leidmiseks ja kuvamiseks on teil kaks võimalust. Esiteks saate vara oma arvutisse alla laadida ja seejärel selle Android Studio-sse importida, nii et need saadetakse koos teie rakendusega ja aitavad kaasa selle APK-i suuruse suurenemisele, või saate need varad käitusajal rakenduse Poly API abil alla laadida.


Platvormidevaheline, REST-põhine Poly API pakub programmilist, ainult kirjutuskaitstud juurdepääsu Poly tohutule 3D-mudelite kogule. See on keerulisem kui APK-ga varade komplekteerimine, kuid Poly-varade käivitamisel käitamisel on mitu eelist, eriti see, et see aitab teie APK-d kontrolli all hoida, mis võib mõjutada seda, kui palju inimesi teie rakenduse alla laadib.

Võite kasutada ka Poly API-d, et anda oma kasutajatele rohkem valikuvõimalusi, näiteks kui arendate mobiilimängu, siis võite lasta kasutajatel kasutajatel valida paljude tähemärkide mudelite hulgast.

Kuna polümudeleid saate vabalt muuta, siis võiksite lasta kasutajatel isegi oma valitud iseloomu näpistada, muutes näiteks juuste või silmade värvi või kombineerides seda muude polüvaradega, näiteks erinevate relvade ja raudrüüdega. Sel viisil saab Poly API aidata teil pakkuda muljetavaldavat hulka 3D-varasid, millel on palju võimalusi kogemuste isikupärastamiseks - ja kõik suhteliselt vähese töö jaoks. Teie kasutajad on veendunud, et olete kulutanud ühe tonni aega, meisterdades hoolikalt kõiki neid 3D-mudeleid!

3D-modelleerimisprojekti loomine

Kavatseme luua rakenduse, mis võtab rakenduse esmakordsel käivitamisel alla konkreetse polüvara ja kuvab kasutaja nõudmisel selle vara täisekraanrežiimis.

Selle vara hankimisel aitan kasutada Fuelit, mis on Kotlini ja Androidi HTTP-võrgukogu. Alustage uue projekti loomisega teie valitud sätetega, kuid kui teil palutakse valida “Kaasa Kotlini tugi”.

Kõik polü API-le tehtavad kõned peavad sisaldama API-võtit, mida kasutatakse teie rakenduse tuvastamiseks ja kasutuspiirangute jõustamiseks. Arenduse ja testimise ajal kasutate sageli piiramatut API-võtit, kuid kui teil on kavas see rakendus vabastada, peate kasutama Androidi piiratud API-võtit.

Piiratud võtme loomiseks peate teadma oma projekti SHA-1 allkirjastamistõendit, nii et hankigem see teave nüüd:

  • Valige Android Studio vahekaart „Gradle“ (kus kursor on paigutatud järgmisele ekraanipildile). See avab paneeli „Gradle projektid“.

  • Tehke topeltklõps paneelil „Gradle projektid”, et laiendada oma projekti juuri ja valige siis „Ülesanded> Android> Allkirjastamisaruanne.” See avab uue rakenduse Android Studio akna allosas.
  • Valige nupp 'Lülita toimingute täideviimine / tekstirežiim' (kus kursor asub järgmises ekraanipildis).

Paneeli „Run” värskendatakse nüüd, et kuvada teie projekti kohta palju teavet, sealhulgas selle SHA-1 sõrmejälge.

Looge Google'i pilvplatvormi konto

Vajaliku API-võtme hankimiseks vajate Google Cloud Platformi (GPC) kontot.

Kui teil pole kontot, saate registreeruda 12-kuuliseks tasuta prooviversiooniks, minnes tasuta lehe Proovi pilveplatvormi juurde ja järgides juhiseid. Pange tähele, et vaja on krediit- või deebetkaarti, kuid lehe Korduma kippuvad küsimused kohaselt kasutatakse seda lihtsalt teie identiteedi kontrollimiseks ja „tasuta prooviperioodi jooksul ei võeta teilt arve ega arveid.”

Hankige oma polü API-võti

Kui olete kõik registreerunud, saate lubada Poly API ja luua oma võtme:

  • Minge üle GCP konsooli.
  • Valige vasakus ülanurgas vooderdatud ikoon ja valige „API-d ja teenused> Armatuurlaud”.
  • Valige „Luba API-d ja teenused”.
  • Valige vasakpoolses menüüs „Muu”.
  • Valige kaart „Poly API”.
  • Klõpsake nuppu „Luba”.
  • Mõne hetke pärast suunatakse teid uuele ekraanile; avage külgmenüü ja valige „API-d ja teenused> Volikirjad”.

  • Järgmisel hüpikaknal valige “Piirata võtit”.
  • Pange oma võtmele eristav nimi.
  • Valige jaotises „Rakendusepiirangud” „Androidi rakendused”.
  • Valige „Lisa paketi nimi ja sõrmejälg”.
  • Kopeerige / kleepige projekti SHA-1 sõrmejälg väljale „Allkirjastamise sertifikaadi sõrmejälg”.
  • Sisestage oma projekti paketi nimi (see kuvatakse manifestis ja iga klassifaili ülaosas).
  • Klõpsake nuppu „Salvesta“.

Teid suunatakse nüüd projekti ekraanile „Volikirjad”, mis sisaldab kõigi teie API-võtmete loendit - sealhulgas äsja loodud polüfunktsioonidega API-võtit.

Projekti sõltuvused: Fuel, P3D ja Kotlin laiendused

Mitmevaraliste varade hankimiseks ja kuvamiseks vajame abikäsi mõnest lisast teegist:

  • Kütus. Poly-l pole praegu ametlikku Androidi tööriistakomplekti, nii et peate API-ga töötama otse, kasutades selle REST-liidest. Selle protsessi lihtsustamiseks kasutan Fuel HTTP võrguteeki.
  • Töötlemine Androidi jaoks. Kasutan polüvara kuvamiseks selle teegi P3D-renderdajat.

Avage projekti build.gradle fail ja lisage need kaks teeki projekti sõltuvustena:

sõltuvused {rakendusfailKolm (sisaldab:, dir: libs) rakenduse "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" juurutamine com.android.support:appcompat-v7:27.1.1 // Lisage kütusekogu / / juurutamine com.github.kittinunf.fuel: kütus-android: 1.13.0 // lisage Androidi mootori töötlemine // juurutamine org.p5android: töötlemise tuum: 4.0.1}

Meie koodi täpsemaks muutmiseks kasutan ka Kotlini Androidi laiendusi, nii et lisame selle pistikprogrammi, kui meil on fail build.gradle avatud:

rakenda pistikprogrammi: kotlin-android-laiendid

Lõpuks, kuna otsime vara Internetist, vajab meie rakendus Interneti luba. Avage manifest ja lisage järgmine teave:

API-võtme lisamine

Iga kord, kui meie rakendus taotleb Polylt vara, peab see sisaldama kehtivat API-võtit. Ma kasutan kohahoidja teksti, aga teie ise peab asendage see kohahoidja oma API-võtmega, kui rakendus kunagi töötab.

Lisan ka tšeki, nii et rakendus kuvab hoiatuse, kui unustate teksti “INSERT-YOUR-API-KEY” asendada:

import android.os.Bundle import android.support.v7.app.AppCompatActivity class MainActivity: AppCompatActivity () {kaasobjekt {const val APIKey = "INSERT-YOUR-API-KEY"} alistab lõbusate onCreate'i (SaveInstanceState: Bundle?) { super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) // Kui API võti algab tähega "INSERT" ... // if (APIKey.startsWith ("INSERT")) {// siis kuvage järgmine röstsai ... .// Toast.makeText (see, "Te pole oma API võtit värskendanud", Toast.LENGTH_SHORT) .show ()} else {... ... ...

Vara hankimine

Saate valida mis tahes vara Google Poly saidil, kuid ma kasutan seda planeedi Maa mudelit.

Vara hankimiseks kasutage selle ID-d, mis kuvatakse URL-i näpu lõpus (eelmises ekraanipildis esiletõstetud). Me ühendame selle vara ID koos Poly API hostiga, mis on „https://poly.googleapis.com/v1”.

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpLae alla import com.github.kittinunf.fuel.httpGaport import kotlinx.android.synthetic.main.activity_main. * import java.io.Failiklass MainActivity: AppCompatActivity () {kaasobjekt {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} alistab lõbusate onCreate (SaveInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (see "Sa pole oma API võtit värskendanud", Toast.LENGTH_SHORT) .show ()} else {

Järgmisena peame tegema vara URL-ile GET-päringu, kasutades meetodit httpGet (). Täpsustan ka seda, et vastuse tüüp peab olema JSON:

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpLae alla import com.github.kittinunf.fuel.httpGaport import kotlinx.android.synthetic.main.activity_main. * import java.io.Failiklass MainActivity: AppCompatActivity () {kaasobjekt {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} alistab lõbusate onCreate (SaveInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (see, "Te pole oma API võtit värskendanud", Toast.LENGTH_SHORT) .show ()} else {// Tehke serverikõne ja edastage seejärel andmed, kasutades Meetod “listOf” // assetURL.httpGet (listOf (APIKey "võti")). ResponseJson {päring, vastus, tulemus -> // Tehke midagi vastusega // tulemus.kehtestatav ({val as seatud = it.obj ()

Varal võib olla mitu vormingut, näiteks OBJ, GLTF ja FBX. Peame kindlaks tegema, et vara on OBJ-vormingus.

Selles etapis otsin ka kõigi allalaaditavate failide nime ja URL-i,
sealhulgas vara esmane fail („juur”) ning kõik seotud materjali- ja tekstuurifailid („ressursid”).

Kui meie rakendus ei suuda vara õigesti hankida, kuvatakse sellel kasutajat teavitav röstsai.

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpLae alla import com.github.kittinunf.fuel.httpGaport import kotlinx.android.synthetic.main.activity_main. * import java.io.Failiklass MainActivity: AppCompatActivity () {kaasobjekt {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} alistab lõbusate onCreate (SaveInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (see, "Te pole oma API võtit värskendanud", Toast.LENGTH_SHORT) .show ()} else {// Tehke vara URL-ile GET-päring // assetURL. httpGet (listOf (APIKey "võti")). responseJson {päring, vastus, tulemus -> // tehke midagi vastusega // tulemus.keerake ({val vara = it.obj () var objectURL: String? = null var materialLibraryName: string? = null var materialLibraryURL: string? = null // Kontrollige vara vormingut, kasutades massiivi „formaadid” // val assetFormats = asset.getJSONArray („formaadid”) // Vaadake läbi kõik vormingud // jaoks (i on 0, kuni assetFormats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // Selle ressursi vormingutüübi tuvastamiseks kasutage formatType. Kui vorming on OBJ… .// if (currentFormat.getString ("formatType") == "OBJ") {//...handage siis selle ressursi juurfail, st OBJ-fail // objectURL = currentFormat. getJSONObject ("root") .getString ("url") // Hankige kõik juurfaili sõltuvused // materialLibraryName = currentFormat.getJSONArray ("ressursid") .getJSONObject (0) .getString ("reliaPath") materialLibraryURL = currentFormat.getJSON ("ressursid") .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). Destination {_, _ -> File (filesDir, "globeAsset.obj")} .response {_ , _, tulemus -> result.fold ({}, {// Kui te ei leia OBJ-faili üles ega alla laadita, kuvage siis tõrge // Toast.makeText (see "Ressurssi ei saa alla laadida", Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). Destination {_, _ -> File (filesDir, materialLibraryName)} .response {_, _, tulemus -> result.fold ({}, {Toast. makeText (see "ressurssi ei saa alla laadida", Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (see "Ressurssi ei saa alla laadida", Toast.LENGTH_SHORT) .show ()})}}}}

Kui installite projekti praegu oma Androidi nutitelefoni või tahvelarvutisse või Android-i virtuaalseadmesse (AVD), laaditakse vara alla edukalt, kuid rakendus ei kuva seda tegelikult. Parandame selle nüüd ära!

Teise ekraani loomine: navigeerimise lisamine

Kuvame selle vara täisekraanrežiimis, nii et värskendame oma faili main_activity.xml, et lisada nupp, mille koputamisel käivitatakse täisekraani tegevus.

Lisame nüüd onClickListeneri faili MainActivity.kt lõppu:

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpLae alla import com.github.kittinunf.fuel.httpGaport import kotlinx.android.synthetic.main.activity_main. * import java.io.Failiklass MainActivity: AppCompatActivity () {kaasobjekt {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} alistab lõbusate onCreate (SaveInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (see, "Te pole oma API võtit värskendanud", Toast.LENGTH_SHORT) .show ()} else {assetURL.httpGet (listOf (APIKey "võti")). responseJson {päring, vastus, tulemus -> result.fold ({val vara = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: Str ing? = null val assetFormats = asset.getJSONArray ("formaadid") for (i in 0 kuni assetFormats.length ()) {val currentFormat = assetFormats.getJSONObject (i) if (currentFormat.getString ("formatType") == "OBJ" ) {objectURL = currentFormat.getJSONObject ("root") .getString ("url") materialLibraryName = currentFormat.getJSONArray ("ressursid") .getJSONObject (0) .getString ("santykPath") materialLibraryURL = currentFormat.getJSONArray ) .getJSONObject (0) .getString ("url") break}} objectURL !!. httpLaadige (). sihtkoht {_, _ -> File (filesDir, "globeAsset.obj")} .response {_, _, tulemus -> result.fold ({}, {Toast.makeText (see, "Ressurssi ei saa alla laadida, Toast.LENGTH_SHORT) .show ()})} materialLibraryURL !!. httpDownload (). Destination {_, _ -> File (filesDir, materialLibraryName)} .vastamine {_, _, tulemus -> result.fold ({}, {Toast.makeText (see "Ressurssi ei saa alla laadida", Toast.LENGTH_SHORT) .show ()})}}, {Toast.makeText (see "Ressurssi ei saa alla laadida", Toast.LENGTH_SHORT) .sh ow ()})} // Rakenda nuppu // displayButton.setOnClickListener {val intent = Intent (this, SecondActivity :: class.java) startActivity (kavatsus); }}}

3D-lõuendi ehitamine

Loogem nüüd tegevus, kus kuvame oma vara täisekraanirežiimis:

  • Klõpsake juhtnuppu oma projekti failil MainActivity.kt ja valige „Uus> Kotlini fail / klass”.
  • Avage rippmenüü „Kind” ja valige „Class”.
  • Pange sellele klassile nimi "SecondActivity" ja klõpsake siis "OK".

3D-objekti joonistamiseks vajame 3D-lõuendit! Kavatsen kasutada Androidi raamatukogu P3D renderdajat Processing for Android, mis tähendab PAppleti klassi laiendamist, sätete () meetodi alistamist ja seejärel P3D edastamist argumendina täisekraanil () kasutatavale meetodile. Peame looma ka atribuudi, mis tähistab Poly vara PShape-objektina.

privaatne lõbus displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null ei ületa lõbusaid seadeid () {täisekraan (PConstants.P3D)}

Järgmisena peame PShape'i objekti lähtestama, ületades häälestusmeetodi () meetodi, kutsudes meetodi loadShape () ja läbides seejärel .obj-faili absoluutse tee:

alistada lõbus seadistamine () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). AbsoluutnePath)}

Joonistamine P3D lõuendil

Sellel 3D lõuendil joonistamiseks peame alistama joonistamise () meetodi:

alistada lõbus joonistamine () {tausta (0) kuju (polyAsset)}}

Vaikimisi on paljud Poly API-st hangitud varad väiksemal küljel, nii et kui te seda koodi nüüd käitate, ei pruugi te seda vara sõltuvalt ekraani konfiguratsioonist isegi näha. 3D-stseenide loomisel loote tavaliselt kohandatud kaamera, nii et kasutaja saaks stseeni uurida ja vaadata teie 3D-vara kogu 360 kraadi ulatuses. Kuid see ei kuulu selle artikli reguleerimisalasse, nii et muudan vara suurust ja asukohta käsitsi, veendumaks, et see sobib ekraanil mugavalt.

Saate vara suurust suurendada, kandes skaala () meetodile negatiivse väärtuse:

skaala (-10f)

Saate vara asukohta virtuaalses 3D-ruumis kohandada, kasutades meetodit tõlkimine () ja järgmisi koordinaate:

  • X. Positsioneerib vara piki horisontaaltelge.
  • Y. Positsioneerib vara piki vertikaaltelge.
  • Z. See on telg “sügavus / kõrgus”, mis muudab 2D objekti 3D-objektiks. Positiivsed väärtused loovad mulje, et objekt tuleb teie poole ja negatiivsed väärtused loovad mulje, nagu objekt eemalduks teist.

Pange tähele, et teisendused on kumulatiivsed, nii et kõik, mis juhtub pärast funktsiooni, kogub efekti.

Kasutan järgmist:

tõlkima (-50f, -100f, 10f)

Siin on täielik kood:

alistada lõbus joonistamine () {taust (0) skaala (-10f) tõlkimine (-50f, -100f) // Joonistage vara, kutsudes kuju () meetodile // kuju (polyAsset)}}

Järgmisena peame looma vastava paigutusfaili, kuhu lisame 3D-lõuendi vidina FrameLayout:

  • Klõpsake juhtnupul oma projekti kaustal „res> paigutus“.
  • Valige „Paigutuse ressursifail”.
  • Pange sellele failile nimi "tegevus_sekund" ja klõpsake siis nuppu "OK".

Nüüd on meil oma "vara_vaade" FrameLayout, peame oma SecondActivity'st sellest teada andma! Pöörake tagasi SecondActivity.kt-faili, looge uus PFragment-eksemplar ja suunake see vidina „asset_view” suunas:

import android.os.Bundle import android.support.v7.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_second. * import töötlemine.android.PFragment import töötlemine.core.PApplet import töötlemine.core.PConstants import töötlemine.core .PShape import java.io.Faili klass SecondActivity: AppCompatActivity () {tühistage lõbus onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_second) displayAsset ()} privaatne lõbus displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null lõbusate sätete tühistamine () {täisekraan (PConstants.P3D)} lõbususe seadistamine alistamine () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). Absoluutne rada)} lõbususe joonistamine () {taust (0) skaala (-10f) tõlke (-50f, -100f) kuju (polyAsset)}} // Lisage järgmine tekst // val assetView = PFragment (canvas3D) assetView.setView (asset_view, this)}}

Viimane samm on teise manifesti lisamine teie manifestile:

// Lisage järgmine //

Oma projekti testimine

Oleme nüüd valmis projekti katsetama! Installige see oma Android-seadmesse või AVD-le ja veenduge, et teil oleks aktiivne Interneti-ühendus. Niipea, kui rakendus käivitub, laadib see vara alla ja saate seda kuvada, puudutades nuppu „Kuva vara”.

Selle täieliku projekti saate alla laadida GitHubist.

Pakkimine üles

Selles artiklis vaatasime, kuidas kasutada Poly API-d 3D-vara hankimiseks käitusel ja kuidas seda vara kuvada, kasutades Androidi teeki. Kas arvate, et Poly API-l on potentsiaali muuta VR- ja AR-arendus kättesaadavaks rohkematele inimestele? Andke meile allolevates kommentaarides teada!

Seotud

  • Google toob AR-i rakendused 2018. aastal sadadesse miljonitesse Android-seadmesse
  • Google õpetab teile tasuta AI-d ja masinõpet
  • 15 parimat VR-mängu Google Cardboardi jaoks
  • 10 parimat VR-rakendust Google Cardboardi jaoks
  • Mis on Google Fuchsia? Kas see on uus Android?
  • Mis on Google Duplex? - funktsioonid, väljalaskekuupäev ja palju muud
  • Kuidas luua VR-i rakendus Androidi jaoks vaid 7 minutiga
  • Mobiilne VR-peakomplekt - millised on teie parimad võimalused?

ee on katkend meie täielikut potituet Drone Ruh.aan aru: teie naabrue on droon - iegi teie vara kohal -, mi muudab teid ebamugavak. Ma ei anna kunagi tunnitut ebameeldivatele või ebaeadulike...

Hiina kaubamärk Doogee on turule laknud Doogee 90.Telefon ühildub paljude liamoodulitega ja elle diain on vatupidav.Varaemad toetajad aavad telefoni kätte alate 299 dollarit.Doogee on t...

Populaarne Saidil