jueves, 28 de diciembre de 2017

Playing Audio on Android from an HTML5 File

Please check: https://www.codeproject.com/Tips/677841/Playing-Audio-on-Android-from-an-HTML5-File
Earlier today, I came across a problem. I have been working on an App in Android that displays HTML5 files from the assets folder inside a WebView. One of the big problems with playing Audio in an HTML5 page is that a lot of browsers do not support the <audio> tag; this includes several versions of the WebView control in different versions of Android. The bottom line is that you can't expect standardized results across different versions of Android when using the HTML5 <audio> tag. So we're going to use a workaround that uses the native Android method of playing audio.
Here is a synopsis of the paragraphs below that describe how to implement the code.
  • Configuring your WebView control
  • Creating an Audio Interface for the HTML5 web page
  • Attaching the Audio Interface to the WebView control
  • Invoking an Audio Interface function from the HTML5 page using JavaScript

Implementing the Code

Configuring your WebView control
Create a WebView control inside your layout. This is the XML code for the layout I used:
<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"



    android:layout_height="fill_parent" />
This is the Java that I used to initially configure the WebView:
 //Configures the WebView during the onCreate method
protected void onCreate(Bundle savedInstanceState) {

    WebView myWebView = (WebView) findViewById(R.id.webview);

    //Set it to a webChromeClient
    myWebView.setWebChromeClient(new WebChromeClient());

    //the default for WebView is that JavaScript isn't enabled in WebView

    //the index.html file is placed in the assets folder
Creating an Audio Interface for the HTML5 web page
Next, we're going to create an AudioInterface Java class to play audio MP3s from the assets folder.
Create a new Java Class and call it "AudioInterface.Java"
Here is the Java code for the class:
import java.io.IOException;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.webkit.JavascriptInterface;

public class AudioInterface {
 Context mContext;

 AudioInterface(Context c) {
  mContext = c;
 //Play an audio file from the webpage
 public void playAudio(String aud) { //String aud - file name passed 
                                     //from the JavaScript function
  final MediaPlayer mp;

     try {
      AssetFileDescriptor fileDescriptor = 
                                 mp = new MediaPlayer();
     } catch (IllegalArgumentException e) {
                           // TODO Auto-generated catch block
              } catch (IllegalStateException e) {
                           // TODO Auto-generated catch block
              } catch (IOException e) {
                           // TODO Auto-generated catch block
The above code creates a public method that accepts a string argument which is used as the URL for the mp3 file location. So I store my mp3 files in a sub folder in the assets folder called audio. So the playAudio method needs an argument similar to this: "audio/example.mp3". If it was stored directly in the assets folder it would look like this: "example.mp3".

Attaching the Audio Interface to the WebView control

Now, we need to attach the AudioInterface class to the WebView control in the onCreate method in order to make it available for the JavaScript code. So add the following code to the onCreate method we edited earlier in the layout's Java file:
myWebView.addJavascriptInterface(new AudioInterface(this), "AndAud");

Invoking an Audio Interface function from the HTML5 page using JavaScript

Now we can call the playAudio function from JavaScript inside the HTML5 file by using this method:
<script type="text/javascript">
 //AndAud is the alias of the AudioInterface class that we attached to the WebView
And that's it, it's kind of an annoying work around but at least you know it will work rather than waiting on the <audio> kinks to be worked out.

martes, 19 de diciembre de 2017

com.google.android.gms.ads.AdView could not be found Android Studio

Go on SDK Manager  > Extras > Select Google Repository and Google Play services and install them.



1) Add component webView on your layout

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="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="com...MainActivity">
    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">
            tools:layout_editor_absoluteY="16dp" />


2) use LoadUrl to show the content :
package com..;
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);
        WebView myWebView = (WebView) this.findViewById(R.id.webView);

3) You are going to need to add some permission to your Manifest:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com..">
    <uses-permission android:name="android.permission.INTERNET" />
    <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>    </application>


miércoles, 13 de diciembre de 2017

Android Studio No USB devices detected

  1. First, enable debugger mode in your android device.
  2. Go to Device Manager from Start Menu and try to find ADB Interface with an error symbol on it. This generally happens because windows sometimes fail to load all the mobile device drives.
  3. Next, Go to http://adbdriver.com/downloads/ and download the driver installer, unzip and run it.
  4. Now go to Android Studio and you should find that everything is working fine.


lunes, 4 de diciembre de 2017

martes, 28 de noviembre de 2017

Quickstart for .NET in the App Engine Flexible Environment

  1. Use the GCP Console to create a new GCP project, create an App Engine application, and enable billing: 
    When prompted, select the region where you want your App Engine application located and then enable billing.
  2. Install the following prerequisites locally:
    1. Download and install the Google Cloud SDK and then initialize the gcloud tool: 
    2. Install the .NET Core SDK, LTS version.
    3. If you are using Visual Studio, to build and run .NET core applications you must install .NET Core tools.
      • Images are available for ASP.NET Core apps written for .NET Core 1.0, 1.1, and 2.0.
    4. To deploy to App Engine directly from Visual Studio, install Google Cloud Tools for Visual Studio.
This quickstart assumes that you are familiar with building web applications with C#.

Download the Hello World app

We've created a simple Hello World app for .NET so you can quickly get a feel for deploying an app to the App Engine flexible environment. It's basically the same application you get when you use Visual Studio to create an empty ASP.NET core application, with an added app.yaml file. The app.yaml file is a App Engine configuration file that specifies your runtime and other App Engine specific settings.
  1. Download the sample app and extract it.
  2. If you're using the command line, navigate into the app directory, dotnet-docs-samples\appengine\flexible\HelloWorld.

Run Hello World on your local machine



To run the Hello World app on your local computer:
  1. Run the following commands from the dotnet-docs-samples\appengine\flexible\HelloWorld directory:
    dotnet restore dotnet run
  2. In your web browser, navigate to http://localhost:5000/
    You can see the "Hello World" message from the sample app displayed in the page.
  3. In your terminal window, press Ctrl+C to exit the web server.

Deploy and run Hello World on App Engine



  1. Run the following commands from the dotnet-docs-samples\appengine\flexible\HelloWorld directory:
    dotnet restore dotnet publish -c Release gcloud app deploy .\bin\Release\netcoreapp1.0\publish\app.yaml
  2. Launch your browser and view the app at http://YOUR_PROJECT_ID.appspot.com, by running the following command:
    gcloud app browse
This time, the page that displays the Hello World message is delivered by a web server running on an App Engine instance.
Congratulations! You've deployed your first .NET app to App Engine flexible environment!
See the following sections for information about cleaning up as well as links to the possible next steps that you can take.

.NET on Google Cloud Platform

Original: https://github.com/salrashid123/gcpdotnet
Sample code demonstrating running trivial .NET web applications on Google Cloud Platform services.
These simply builds off of existing technologies and samples but configures it to run on GCP effeciently with healh checking and load balancing.

The example here uses Microsofts's .NET Core 1.0.0 RC/preview (dotnet-dev-1.0.0-preview2-003121).
FROM microsoft/dotnet:1.1.0-sdk-projectjson

ADD . /app
RUN ["dotnet", "restore"]

WORKDIR /app/src/WebApplication1/
ENTRYPOINT ["dotnet", "run", "-p", "project.json"]

in project.json:
"Microsoft.NETCore.App": {
   "type": "platform",
   "version": "1.1.0"
You can use Visutal Studio 2015 to create and extend the sample from scratch. VS2015
  • WebApplication1 Default webapplication generated by Visual Studio 2015: "New Project
    • C#
      • Web
        • ASP.NET Core Web Application (.NET Core) ; (Change Authenticaiton --> No Authentication)
(optionally, if you want to try out Google APIs, see Using Google API Libraries)
Basic Configuration
Sample application simply spins up inside a Docker container an runs Kestrel to host the application. The sample is modified from the baseline in the following way to run with healthchecks in GCP:
  • port: 8080
  • GET requests to endpoint /_ah/health must return a 200 OK HTTP response
  • Use Kestrel Webserver

Pack/Publish steps
If you want to pack the deployment to a .dll using dotnet publish
in project.json, if the following artifiact from Visual Studio exists, remove
  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
Then make the build/release .dll
cd WebApplication1/src/WebApplication1
dotnet restore
dotnet publish  -c Release
To run the local pack directly:
dotnet bin/Release/netcoreapp1.0/publish/WebApplication1.dll
Finally, edit the Dockerfile
FROM microsoft/dotnet:1.1.0-sdk-projectjson

ADD . /app

WORKDIR /app/src/WebApplication1/
ENTRYPOINT ["dotnet", "bin/Release/netcoreapp1.0/publish/WebApplication1.dll"]
Note: As of 8/16, dotnet is currently not supported on Alpine Linux.
Deploying to GCP requires your gcloud environment to get setup:
gcloud auth login
gcloud config set project <your_project>
Deploying to GAE is pretty simple:
gcloud app deploy app.yaml
Then, http://your_project.appspot.com
To deploy on GKE, you need to setup the replication controllers and frontend loadbalancer services as well as a small cluster.