Facebook and Google OAuth with IONIC and AngularJS - TechieDreams

Created: 2015-09-01 13:30 Updated: 2015-09-01 13:30 Source: http://techiedreams.com/facebook-and-google-oauth-with-ionic-and-angularjs/ Notebook: All Tech/Frontend Development

TechieDreams
Posted:
Jan 24, 2015
Tags:
Comments:
31 Comments

Facebook and Google OAuth with IONIC and AngularJS

OAUTH gives a flexibility to choose the some of the Largest Data providers Example: Facebook and Google to Authenticate our Application user on our behalf. Other cool things are not just Authentication we can also request for user Profile details, friends etc.

Most of the times for an user registration we might just need Profile information like: name, email, profile pic, gender etc.. So as you can see by now we can SKIP the large forms for registration and login and JUST with a button click it takes you directly to the content no hassle.

So how to make this happen? Simple register your App with the Providers, basically they ask you to create an App on their developer sites. Once created an App you will have access to some tokens and keys which further can be used in the client Apps for Authentication and fetching other informations.

Here are the labels in this Tutorial to follow along:

  1. What’s the out come of this tutorial?
  2. Create an App on Facebook and Google and get the Keys for OAuth
  3. Creating a Basic App layout using IONIC
  4. Adding functionality with AngularJS
  5. User session using $cookieStore
  6. Wrapping up

1. What’s the out come of this tutorial?

We are going to create a simple Application with two screens,

  • Welcome/Login screen: Displaying the App logo and social login buttons
  • Dashboard/Profile: Displaying the logged in user details.

Here is the Demo URL check out: http://techiedreams.com/demos/oauth-ionic-angular/

Download the Sources from GitHub: https://github.com/chanusukarno/Angular-Ionic-OAuth

Other tips also covered with the Sample App:

  • Client session maintenance using Cookies
  • Profile cover design with Blurred-Glassy-Scaled effect

 

Prerequisites: Please check out some of the basic tutorials on Ionic and AngularJS, before jumping further in to this tutorial:

AngularJS: http://techiedreams.com/category/angularjs/

Ionic Framework: http://techiedreams.com/category/ionic-framework/

 

2. Create an App on Facebook and Google and get the Keys for OAuth

Facebook:

Video:

Step 1: Goto https://developers.facebook.com/ and login

Step 2: From the Left menu select Manage Apps under Developer

Step 3: User My Apps select Add a New App

Step 4: From the popup select Website

Step 5: Type in a name for the App and click Create New Facebook App ID

Step 6: Choose category form the Popup and Click Create App ID

Step 7: Enter the Captcha and click Submit

Now we are done with App creation. Go and setup other features.

Step 8: Under Tell us about your website Enter your website URL:

While testing under development you can use the local URL itself ex:  http://localhost:8100/

Later when published we need to change update this URL to the server address. And click Next.

Now copy the App ID and replace it in the index.html and Test the App ionic serve .

Not done yet! Now the can only be tested by you, follow along to make it available for general public:

Step 9: Go to home page https://developers.facebook.com/ refresh now under My Apps we see our new App, select it.

Step 10: Under the Left Menu Select Status & Review

Step 11: When you try to switch that button it will ask you setup a valid email. Goto Settings and set a valid email then return to Status & Review and Switch the button.

Additionally Goto App Details and setup a logo for your App and other information.

 

Google+:

Video:

Step 1: Goto https://console.developers.google.com/project

Step 2: Login to with gmail account and Click Create Project

Step 3: Enter project name in the Popup and click create

Step 4: In the left Menu under API’s and auth select APIs

Step 5: Under Browse APIs Search for Google+ and turn it on

Step 6:  In the left Menu under API’s and auth select Credentials

Step 7: It will ask you to first setup consent screen[Screen to setup about your App], click Configure consent screen

Step 8: Select email address, Give a name to Product, Optionally you can set a home page url and a URL to your App logo and Save

Step 9: Now give your App url under Create Client id and Click Create client ID

Step 10: Under public API access in the same screen click Create new Key

Step 11: Select Browser key from popup and enter your URL Ex:  http://localhost:8100/*  [* indicates any subfolder] and click Create new Key

Note: For development you can enter local address and while in Production update this urls to the servers

Copy the API KEY and replace it in Index.html Then again copy the CLIENT ID and in your controller replace the existing and Test the App  ionic serve

 

3. Creating a Basic App layout using IONIC

Firstly setup a new ionic project, follow this tutorial for instructions: http://techiedreams.com/getting-started-with-ionic-framework/

Then will design our welcome page, where will have a background image and app logo and login options at the center:

welcome.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<ion-view title="" id="welcome-view" hide-nav-bar="true">
    <ion-content>
        <div  class="logo-welcome"></div>
        <div class="login-btns">
            <div id="social-links">
                <ul>
                    <li ng-click="fbLogin()"><span class="ifacebook"><img src="img/social-icons/facebook.png"></span><a href="#" class="afacebook">sign in with facebook</a></li>
                    <li ng-click="gplusLogin()"><span class="igoogleplus"><img src="img/social-icons/googleplus.png"></span><a href="#" class="agoogleplus">sign in with google+</a></li>
                </ul>
            </div>
            <hr id="login-divider" />
            <div id="login-reg">
                <button id="btn-login" class="button button-clear button-positive uppercase">Login</button>
                <button id="btn-reg" class="button button-clear button-positive uppercase">Register</button>
            </div>
        </div>
    </ion-content>
    <div id="footer" class="bar bar-footer">
        <div class="title em-footer-title">© TechieDreams</div>
    </div>
</ion-view>

For this layout we don’t need a header so we can set hide-nav-bar="true"  on <ion-view>.

Then we add an ul to hold our social login buttons.

Then below the social buttons we add two buttons for email login and registration.

dashboard.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<ion-view>
    <ion-header-bar class="bar-header bar-positive">
        <div class="title uppercase">Welcome</div>
        <button class="button button-clear" ng-click="logout()">Logout</button>
    </ion-header-bar>
    <ion-content>
        <div class="list">
            <div class="profile-container">
                <!--<div id="em-profile" class="item">-->
                    <!-- <img src="img/ionic.png"> -->
                    <div ng-if="user.profilePic" class="profile-pic" ng-style="{'background-image': 'url(' + user.profilePic + ')'}"></div>
                    <div ng-if="!user.profilePic" class="profile-pic" style="background-image: url(img/profile-pic-default.png)"></div>
                <!--</div>-->
                <div id="myDiv">
                    <div id="color">
                        <div id="effect"></div>
                    </div>
                </div>
                <div class="profile-background" ng-style="{'background-image': 'url(' + user.profilePic + ')'}"></div>
            </div>
            <div class="list">
                <label class="item item-input field-disabled">
                    <span class="input-label">Email</span>
                    <input ng-model="user.email" type="text" placeholder="user@gmail.com">
                </label>
                <label class="item item-input">
                    <span class="input-label">Display Name</span>
                    <input ng-model="user.name" type="text" placeholder="Chanu Sukarno">
                </label>
                <label class="item item-input">
                    <span class="input-label">Country</span>
                    <input ng-model="user.country" type="text" placeholder="INDIA">
                </label>
                <label class="item item-input">
                    <span class="input-label">Phone</span>
                    <input ng-model="user.phone" type="text" placeholder="+91 8123595959">
                </label>
                <label class="item item-input">
                    <span class="input-label">Birthday</span>
                    <input ng-model="user.dobObj" type="date" placeholder="">
                </label>
                <label class="item item-input em-gender">
                    <span class="input-label">Gender</span>
                    <ion-checkbox class="em-gender-cb" ng-model="isMale" ng-change="isMale ? user.gender='M' : user.gender = 'F';
                        isFemale = false" ng-checked="user.gender === 'M'">Male</ion-checkbox>
                    <ion-checkbox class="em-gender-cb" ng-model="isFemale" ng-change="isFemale ? user.gender='F' : user.gender = 'M';
                        isMale = false" ng-checked="user.gender === 'F'">Female</ion-checkbox>
                </label>
 
            </div>
        </div>
    </ion-content>
</ion-view>

Our dashboard in this example its rather a Profile where it holds user info like:

  • Email
  • Display Name
  • Country
  • Phone
  • DOB
  • Gender

Ionic has default styles available for all the components but for positioning on desired locations we need to write our own CSS.

Here is out final styles.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* Empty. Add your own CSS if you like */
body {
    font-family: 'Roboto', serif;
}
 
#welcome-view {
    background: url(../img/welcome_bg.png) no-repeat center center fixed;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    background-size: cover;
}
 
.logo-welcome {
    width: 120px;
    height: 120px;
    margin: 100px auto 60px auto;
    background: url(../img/ionic.png) no-repeat;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    background-size: cover;
}
 
hr {
    display: block;
    height: 1px;
    border: 0;
    border-top: 1px solid #ccc;
}
 
.login-btns {
    width: 250px;
    margin: 0 auto 0 auto;
}
 
#btn-reg {
    float: right;
}
 
#login-divider {
    margin: 40px 0 10px 0;
}
 
#footer {
    background: #5A5A5A;
    opacity: 0.4;
    color: #fff;
}
 
.uppercase {
    text-transform: uppercase;
}
 
#btn-reg, #btn-login {
    color: white;
}
 
.em-small {
    font-size: 16px;
    text-decoration: none;
}
 
.bar .title {
    font-weight: bold;
    text-align: center !important;
 
}
 
.em-padding-header {
    padding: 2px;
}
 
.profile-container {
    position: relative;
    padding: 35px;
    background-color:lightblue;
}
 
.profile-background {
    position:absolute;
    top:-20%;
    left:-20%;
    width:140%;
    height:140%;
    z-index:1;
    background-size: cover;
    -webkit-filter: blur(30px);
    -moz-filter: blur(25px);
    -o-filter: blur(25px);
    -ms-filter: blur(25px);
    filter: blur(25px);
    opacity: 0.65;
}
 
.profile-pic {
    position:relative;
    z-index:5;
    text-align: center;
    height: 95px;
    width: 95px;
    background-size: cover;
    display: block;
    margin: 0 auto 0 auto;
    border-radius: 100px;
    -webkit-border-radius: 100px;
    -moz-border-radius: 100px;
}
 
.em-gender .item-checkbox {
    padding-left: 50px !important;
    font-size: 14px;
    border-width: 0;
    padding: 10px 0px 10px 0px;
    margin: 0px;
}
 
.platform-android ion-popover-view.fit {
    margin-top: 10px !important;
}

Cool we now have our UI setup. Lets add the functionality to it now.

 

4. Adding functionality with AngularJS

Facebook or Google allows you to load the oauth js library dynamically, In the sense the initial loading time of your application doesn’t depend on the oauth libraries.

Also we need to initialize oauth with the keys we stored in the first step.

In the index.html we added this script to initialize and load the SDK dynamically:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script>
            // Facebbok OAuth init
            window.fbAsyncInit = function () {
                FB.init({
                    appId: '1529225140628860', // Replace the App ID with yours
                    status: true, // check login status
                    cookie: true, // enable cookies to allow the server to access the session
                    xfbml: true  // parse XFBML
                });
            };
 
            // Load the SDK asynchronously
            (function (d) {
                var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
                if (d.getElementById(id)) {
                    return;
                }
                js = d.createElement('script');
                js.id = id;
                js.async = true;
                js.src = "//connect.facebook.net/en_US/all.js";
                ref.parentNode.insertBefore(js, ref);
            }(document));
            // Facebbok OAuth init - END
            
            // Google OAuth Init
            (function () {
                var po = document.createElement('script');
                po.type = 'text/javascript';
                po.async = true;
                po.src = 'https://apis.google.com/js/client.js?onload=onLoadCallback';
                var s = document.getElementsByTagName('script')[0];
                s.parentNode.insertBefore(po, s);
            })();
 
            function onLoadCallback() {
                // Replace the API key with yours
                gapi.client.setApiKey('AIzaSyC5JgBIrjOGKDAIZLcsVHvgkjjGkkrZTqk');
                gapi.client.load('plus', 'v1', function () {
                });
            }
            // Google Oauth Init - END
        </script>

And in our controller we add this script to query the Facebook and Google to get user details. Code is commented where necessary.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
var oauthApp = angular.module('oauthApp.controllers', []);
oauthApp.controller('welcomeCtrl', function ($scope, $state, $cookieStore) {
 
    /**
     * SOCIAL LOGIN
     * Facebook and Google
     */
    // FB Login
    $scope.fbLogin = function () {
        FB.login(function (response) {
            if (response.authResponse) {
                getUserInfo();
            } else {
                console.log('User cancelled login or did not fully authorize.');
            }
        }, {scope: 'email,user_photos,user_videos'});
 
        function getUserInfo() {
            // get basic info
            FB.api('/me', function (response) {
                console.log('Facebook Login RESPONSE: ' + angular.toJson(response));
                // get profile picture
                FB.api('/me/picture?type=normal', function (picResponse) {
                    console.log('Facebook Login RESPONSE: ' + picResponse.data.url);
                    response.imageUrl = picResponse.data.url;
                    // store data to DB - Call to API
                    // Todo
                    // After posting user data to server successfully store user data locally
                    var user = {};
                    user.name = response.name;
                    user.email = response.email;
                    if(response.gender) {
                        response.gender.toString().toLowerCase() === 'male' ? user.gender = 'M' : user.gender = 'F';
                    } else {
                        user.gender = '';
                    }
                    user.profilePic = picResponse.data.url;
                    $cookieStore.put('userInfo', user);
                    $state.go('dashboard');
 
                });
            });
        }
    };
    // END FB Login
 
    // Google Plus Login
    $scope.gplusLogin = function () {
        var myParams = {
            // Replace client id with yours
            'clientid': '18301237550-3vlqoed2en4lvq6uuhh88o2h1l9m70tr.apps.googleusercontent.com',
            'cookiepolicy': 'single_host_origin',
            'callback': loginCallback,
            'approvalprompt': 'force',
            'scope': 'https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read'
        };
        gapi.auth.signIn(myParams);
 
        function loginCallback(result) {
            if (result['status']['signed_in']) {
                var request = gapi.client.plus.people.get({'userId': 'me'});
                request.execute(function (resp) {
                    console.log('Google+ Login RESPONSE: ' + angular.toJson(resp));
                    var userEmail;
                    if (resp['emails']) {
                        for (var i = 0; i < resp['emails'].length; i++) {
                            if (resp['emails'][i]['type'] == 'account') {
                                userEmail = resp['emails'][i]['value'];
                            }
                        }
                    }
                    // store data to DB
                    var user = {};
                    user.name = resp.displayName;
                    user.email = userEmail;
                    if(resp.gender) {
                        resp.gender.toString().toLowerCase() === 'male' ? user.gender = 'M' : user.gender = 'F';
                    } else {
                        user.gender = '';
                    }
                    user.profilePic = resp.image.url;
                    $cookieStore.put('userInfo', user);
                    $state.go('dashboard');
                });
            }
        }
    };
    // END Google Plus Login
 
});

 

 5. User Session using $cookieStore:

We use $cookieStore from angular-cookies.js, to setup user session when he logs in. On every route change will look if user is authenticated or not. Here is simple script for maintaining session with $cookieStore:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// App.js
var oauthApp = angular.module('oauthApp', ['ngCookies', 'ionic', 'oauthApp.controllers']);
 
oauthApp.run(function ($rootScope, $cookieStore, $state) {
    // Check login session
    $rootScope.$on('$stateChangeStart', function (event, next, current) {
        var userInfo = $cookieStore.get('userInfo');
        if (!userInfo) {
            // user not logged in | redirect to login
            if (next.name !== "welcome") {
                // not going to #welcome, we should redirect now
                event.preventDefault();
                $state.go('welcome');
            }
        } else if (next.name === "welcome") {
            event.preventDefault();
            $state.go('dashboard');
        }
    });
});

Note: ngCookies module should be added as a dependency before using $cookieStore.

Once user logs out we can remove the user data from the cookies, so our dashboardCtrl will be as follows:

1
2
3
4
5
6
7
8
9
10
11
12
// Dashboard/Profile Controller
module.controller('dashboardCtrl', function ($scope, $window, $state, $cookieStore) {
    // Set user details
    $scope.user = $cookieStore.get('userInfo');
    
    // Logout user
    $scope.logout = function () {
        $cookieStore.remove("userInfo");
        $state.go('welcome');
        $window.location.reload();
    };
});

6. Wrapping up

We now have Facebook and Google+ login system integrated in our Application. Its quite simple to include other OAuth systems also, a similar procedure try it out. Any quires post in the comments.

Note: By default when you click on oauth login buttons it opens the default browser on your Mobile. To make your app to handle the browser calls add ‘inappbrowser‘ cordova plugin:

From terminal in the Project directory Run:
cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

 

 

Subscribe  &  Share   Thanks!

 

My Twitter profileMy Facebook profileMy Google+ profile
Hi this is Chanu! Admin of TD. I am a Tech enthusiast and have passion towards mobile Dev. I love Blogging and WEB. I currently work on Technologies like: Java, Android, iOS, PHP, DotNet, CMS. I like to play with new and hot Technologies. I mostly believe in " Solve a real life Problem and the World will be yours "
(Visited 7,925 time, 1 visit today)

This entry was posted in Ionic Examples

31 Responses

  • h, thanks for the tutorial , it works perfectly fine, but when i use this method in a cellphone android, doesnt work, what can i do? thanks

    • It should work on mobile as well but to open the oauth login popup with in the App add in app browser plugin:
      From terminal in the app directory Run:
      cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

  • hello, pls, I add the plugin and it works perfectly fine on the browser. But when I run in a cellphone show me a google message (ERROR: invalid_reques – invalid parameter value for origin: Missing authority: file://. ).

    Tks.!

  • Hi !!! Any idea why when you test in a device the facebook button doesnt work ??

  • Thank’s for the tutorial! It’s work in browser but when i try run in android show this message “invalid_request invalid parameter value for origin: Missing authority: file://”

  • Hi, i am having same problem as alsuelo, the facebook button is not working.. any clue?

  • Hi, this is not working for me. could you please provide some assistance. I have followed every step of yours but it is not working on my device, works fine with ionic serve.

  • Is there any way to use Facebook app and google account to log into my app?

  • “It should work on mobile as well but to open the oauth login popup with in the App add in app browser plugin: From terminal in the app directory Run: cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git – See more at: http://techiedreams.com/facebook-and-google-oauth-with-ionic-and-angularjs/#sthash.XWkKdqfU.dpuf ” Not working on Mobile app.

  • Sending to PhoneGap build, the button does not perform any function, you could tell that the installation of any extra plugin is required?

  • Hi there, does the login information store anywhere?

  • Hi i already install inappbrowser but it return to me Error: invalid_request invalid parameter value for origin:Missing Authority:file://

    it working fine at ionic serve but when i try login at my mobile it return me this error what did i do wrong?

  • Really good tutorial

  • Rohit Deshmukh June 17, 2015 at 4:27 pm

    sir i try this application i works well but it can’t fetch mobile number and birth-date form the users account and for my application mobile number is necessary can you please help me to solve this problem??

  • Rohit Deshmukh June 17, 2015 at 4:30 pm

    *i mean application works fine but it can not fetch mobile number from users account

  • Can you please look into the issue ” Error: invalid_request invalid parameter value for origin:Missing Authority:file://”. Inappbrowser plugin is installed. Everything works flawlessly in a desktop browser. However using Ionic View on a mobile device (iOS or Android) I get above error code. Thanks for the great tutorial.

  • Any one who solved the issues with facebook login button ?

  • how to add ngcordova oauth plugin ,so that it can work on both mobile as well as web.?please give us answer …plzzzzzzzzzzzzzz

  • In mobile i m getting FB and GAPI not defined on clicking on respected buttons

  • 08-03 01:44:53.675 26897-26897/com.ionicframework.angularoauth825929 E/Web Console? ReferenceError: gapi is not defined
    at k.gplusLogin (file:///android_asset/www/js/controllers/controllers.js:57:9)
    at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:228:502
    at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:385:21137
    at k.$eval (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:156:305)
    at k.$apply (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:157:6)
    at HTMLLIElement. (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:385:21119)
    at HTMLLIElement. (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:63:285)
    at n (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:384)
    at t (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:216)
    at HTMLDocument.l (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:1447) at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:133

  • 08-03 01:46:00.890 26897-26897/com.ionicframework.angularoauth825929 E/Web Console? ReferenceError: FB is not defined
    at k.fbLogin (file:///android_asset/www/js/controllers/controllers.js:10:9)
    at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:228:502
    at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:385:21137
    at k.$eval (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:156:305)
    at k.$apply (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:157:6)
    at HTMLLIElement. (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:385:21119)
    at HTMLLIElement. (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:63:285)
    at n (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:384)
    at t (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:216)
    at HTMLDocument.l (file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:22:1447) at file:///android_asset/www/lib/ionic/js/ionic.bundle.min.js:133

  • Hi it is not working in mobile app. Can you explain, How to write code for working in mobile application.

  • Hi.. Thanks for this tutorial man… helped me a lot !!! any idea on how to get facebook and google friends / contact list ?

  • I download the zip file and extracted. then i tried to import the proj. But i can’t able to import this proj in my eclipse(juno). help me.. Reply as soon as possible. Thanks in advance!

    error when i tried to import this proj

    1.import->android->Existing android code into workspace
    ” Select a directory to search for existing Android projects” error

    2.import->General->Existing projects into workspace
    ” No projects are found to import” error

  • not able to get email from facebook..only name and profile pic i am getting



Post a comment

.
www.techiedreams.com © 2015 Some rights reserved.
 
37
Like
7

This page has been shared 18 times. View these Tweets.

email
http://localhost:8100/*

View static HTML