dependencies { compile 'com.google.android.support:wearable:1.2.0' provided 'com.google.android.wearable:wearable:1.0.0' }
<application> <uses-library android:name="com.google.android.wearable" android:required="false" /> ...</application>
<uses-permission android:name="android.permission.WAKE_LOCK" />
setAmbientEnabled()
GoogleMapOptions.ambientEnabled(true)
onEnterAmbient()
MapFragment.onEnterAmbient()
MapView.onEnterAmbient()
onUpdateAmbient()
onExitAmbient()
MapFragment.onExitAmbient()
MapView.onExitAmbient()
build.gradle
Theme Editor Ci rendiamo conto che la gestione del tema e dello stile delle app può risultare un po’ complessa. Insieme ad Android Studio 1.4 stiamo rilasciando un’anteprima di Theme Editor per semplificare questa attività. Questa prima versione di Theme Editor si concentra sulla modifica e l’aggiornamento dei colori del tema dei materiali (colors.xml) nel progetto dell’app. Nelle versioni successive includeremo più attributi dei file dei temi e degli stili delle app. Per accedere all’editor, passare dal menu di primo livello Tools → Android → Theme Editor (Strumenti > Android > Editor dei temi).
colors.xml
Modelli di progetto Sappiamo che molti sviluppatori utilizzano i modelli dell’app New Project Wizard per avviare un nuovo progetto di app o per aggiungere rapidamente un’attività a un’app esistente. Per agevolare la struttura visiva delle app abbiamo aggiornato i modelli per includere la libreria di supporto Android Design insieme alla libreria di supporto AppCompat.
Dalla creazione guidata modello è possibile avviare i progetti con un modello vuoto di base con un pulsante di azione mobile o avviare da una gamma di componenti dell’interfaccia utente quali il navigation drawer o AppBar con vista scorrevole. Inoltre, abbiamo reintrodotto il modello per app vuoto per quanti preferiscono una generazione di codice minima in caso di aggiunta di un’attività al progetto.
<fragment android:id="@+id/streetview" android:name= "com.google.android.gms.maps.StreetViewPanoramaFragment" android:layout_width="match_parent" android:layout_height="match_parent"/>
streetViewPanorama.setPosition(targetLatLng); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera(zoom, tilt, bearing); mStreetViewPanorama.animateTo(camera, duration);
mAnimHandler.post(new Runnable() { @Override public void run() { marker.setIcon(mSteamFrames.nextFrame()); // Next frame in 32 ms mAnimHandler.postDelayed(this, 32); } });
ColorMatrix desatMatrix = new ColorMatrix(); desatMatrix.setSaturation(restaurantRating); ColorFilter paintColorFilter = new ColorMatrixColorFilter(desatMatrix); Paint paint = new Paint(); paint.setColorFilter(paintColorFilter); Canvas canvas = new Canvas(newImage); canvas.drawBitmap(oldImage, 0, 0, paint);
compile 'com.google.maps.android:android-maps-utils:0.3+'
public interface ClusterItem { LatLng getPosition(); }
mClusterManager = new ClusterManager<>(this, mMap); mMap.setOnCameraChangeListener(mClusterManager); mMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.addItem(clusterItem);
mHeatmapTileProvider = new HeatmapTileProvider.Builder() .data(mLatLngCollection) .build();
mTileOverlay = mMap.addTileOverlay( new TileOverlayOptions().tileProvider(mHeatmapTileProvider));
adb shell pm list permissions -g -d
mFragment = (SearchFragment) getFragmentManager() .findFragmentById(R.id.search_fragment); if (!USE_INTERNAL_SPEECH_RECOGNIZER) { mSpeechRecognitionCallback = new SpeechRecognitionCallback() { @Override public void recognizeSpeech() { if (DEBUG) Log.v(TAG, "recognizeSpeech"); // ACTION_RECOGNIZE_SPEECH startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH); } }; mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback); }
KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); keyPairGenerator.initialize( new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_SIGN) .setDigests(KeyProperties.DIGEST_SHA256) .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1")) .setUserAuthenticationRequired(true) .build()); keyPairGenerator.generateKeyPair();
.setUserAuthenticationRequired(true)
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); PublicKey publicKey = keyStore.getCertificate(MainActivity.KEY_NAME).getPublicKey(); KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); PrivateKey key = (PrivateKey) keyStore.getKey(KEY_NAME, null);
boolean enroll(String userId, String password, PublicKey publicKey);
Signature.getInstance("SHA256withECDSA"); KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); PrivateKey key = (PrivateKey) keyStore.getKey(KEY_NAME, null); signature.initSign(key); CryptoObject cryptObject = new FingerprintManager.CryptoObject(signature); CancellationSignal cancellationSignal = new CancellationSignal(); FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class); fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
Signature signature = cryptoObject.getSignature(); // Include a client nonce in the transaction so that the nonce is also signed // by the private key and the backend can verify that the same nonce can't be used // to prevent replay attacks. Transaction transaction = new Transaction("user", 1, new SecureRandom().nextLong()); try { signature.update(transaction.toByteArray()); byte[] sigBytes = signature.sign(); // Send the transaction and signedTransaction to the dummy backend if (mStoreBackend.verify(transaction, sigBytes)) { mActivity.onPurchased(sigBytes); dismiss(); } else { mActivity.onPurchaseFailed(); dismiss(); } } catch (SignatureException e) { throw new RuntimeException(e); }
@Override public boolean verify(Transaction transaction, byte[] transactionSignature) { try { if (mReceivedTransactions.contains(transaction)) { // It verifies the equality of the transaction including the client nonce // So attackers can't do replay attacks. return false; } mReceivedTransactions.add(transaction); PublicKey publicKey = mPublicKeys.get(transaction.getUserId()); Signature verificationFunction = Signature.getInstance("SHA256withECDSA"); verificationFunction.initVerify(publicKey); verificationFunction.update(transaction.toByteArray()); if (verificationFunction.verify(transactionSignature)) { // Transaction is verified with the public key associated with the user // Do some post purchase processing in the server return true; } } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { // In a real world, better to send some error message to the user } return false; }