Mobile Browser Download Site
http://www.opera.com/mobile/download/versions/
Mobile BI software
http://www.softwareadvice.com/bi/mobile-business-intelligence-comparison/
oracle mobile BI
http://www.oracle.com/us/solutions/business-analytics/business-intelligence/mobile/overview/index.html#ct02-Download
Mobile Contact online Backup system
https://www.lookout.com/
1. https://netbeans.org/kb/73/javame/quickstart.html
2. http://www.oracle.com/technetwork/java/embedded/javame/java-mobile/learnmore/index.html
3. http://www.oracle.com/technetwork/java/embedded/javame/java-mobile/learnmore/index.html
4. http://www.oracle.com/technetwork/java/embedded/javame/java-mobile/learnmore/index.html
5. https://developer.sony.com/2013/11/29/how-to-develop-an-app-using-the-camera-remote-api-2/
6. http://www.informationweek.com/consumer/online-backup-vs-cloud-storage/d/d-id/1107440?
7. http://www.windowsphone.com/en-in/how-to/wp7/people/set-up-an-email-account
8. http://alvinalexander.com/java/jwarehouse/apps-for-android/SampleSyncAdapter/src/com/example/android/samplesync/platform/index.shtml
Android example source code file (BatchOperation.java)
This example Android source code file (BatchOperation.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Android by Example" TM.
The BatchOperation.java Android example source code
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.example.android.samplesync.platform; import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.Context; import android.content.OperationApplicationException; import android.os.RemoteException; import android.provider.ContactsContract; import android.util.Log; import java.util.ArrayList; /** * This class handles execution of batch mOperations on Contacts provider. */ public class BatchOperation { private final String TAG = "BatchOperation"; private final ContentResolver mResolver; // List for storing the batch mOperations ArrayList<ContentProviderOperation> mOperations; public BatchOperation(Context context, ContentResolver resolver) { mResolver = resolver; mOperations = new ArrayList<ContentProviderOperation>(); } public int size() { return mOperations.size(); } public void add(ContentProviderOperation cpo) { mOperations.add(cpo); } public void execute() { if (mOperations.size() == 0) { return; } // Apply the mOperations to the content provider try { mResolver.applyBatch(ContactsContract.AUTHORITY, mOperations); } catch (final OperationApplicationException e1) { Log.e(TAG, "storing contact data failed", e1); } catch (final RemoteException e2) { Log.e(TAG, "storing contact data failed", e2); } mOperations.clear(); } }
9. http://alvinalexander.com/java/jwarehouse/apps-for-android/SampleSyncAdapter/src/com/example/android/samplesync/platform/ContactOperations.java.shtml
Android example source code file (ContactOperations.java)
This example Android source code file (ContactOperations.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Android by Example" TM.
The ContactOperations.java Android example source code
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.example.android.samplesync.platform; import android.content.ContentProviderOperation; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.provider.ContactsContract; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.text.TextUtils; import android.util.Log; import com.example.android.samplesync.Constants; import com.example.android.samplesync.R; /** * Helper class for storing data in the platform content providers. */ public class ContactOperations { private final ContentValues mValues; private ContentProviderOperation.Builder mBuilder; private final BatchOperation mBatchOperation; private final Context mContext; private boolean mYield; private long mRawContactId; private int mBackReference; private boolean mIsNewContact; /** * Returns an instance of ContactOperations instance for adding new contact * to the platform contacts provider. * * @param context the Authenticator Activity context * @param userId the userId of the sample SyncAdapter user object * @param accountName the username of the current login * @return instance of ContactOperations */ public static ContactOperations createNewContact(Context context, int userId, String accountName, BatchOperation batchOperation) { return new ContactOperations(context, userId, accountName, batchOperation); } /** * Returns an instance of ContactOperations for updating existing contact in * the platform contacts provider. * * @param context the Authenticator Activity context * @param rawContactId the unique Id of the existing rawContact * @return instance of ContactOperations */ public static ContactOperations updateExistingContact(Context context, long rawContactId, BatchOperation batchOperation) { return new ContactOperations(context, rawContactId, batchOperation); } public ContactOperations(Context context, BatchOperation batchOperation) { mValues = new ContentValues(); mYield = true; mContext = context; mBatchOperation = batchOperation; } public ContactOperations(Context context, int userId, String accountName, BatchOperation batchOperation) { this(context, batchOperation); mBackReference = mBatchOperation.size(); mIsNewContact = true; mValues.put(RawContacts.SOURCE_ID, userId); mValues.put(RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE); mValues.put(RawContacts.ACCOUNT_NAME, accountName); mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues); mBatchOperation.add(mBuilder.build()); } public ContactOperations(Context context, long rawContactId, BatchOperation batchOperation) { this(context, batchOperation); mIsNewContact = false; mRawContactId = rawContactId; } /** * Adds a contact name * * @param name Name of contact * @param nameType type of name: family name, given name, etc. * @return instance of ContactOperations */ public ContactOperations addName(String firstName, String lastName) { mValues.clear(); if (!TextUtils.isEmpty(firstName)) { mValues.put(StructuredName.GIVEN_NAME, firstName); mValues.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); } if (!TextUtils.isEmpty(lastName)) { mValues.put(StructuredName.FAMILY_NAME, lastName); mValues.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); } if (mValues.size() > 0) { addInsertOp(); } return this; } /** * Adds an email * * @param new email for user * @return instance of ContactOperations */ public ContactOperations addEmail(String email) { mValues.clear(); if (!TextUtils.isEmpty(email)) { mValues.put(Email.DATA, email); mValues.put(Email.TYPE, Email.TYPE_OTHER); mValues.put(Email.MIMETYPE, Email.CONTENT_ITEM_TYPE); addInsertOp(); } return this; } /** * Adds a phone number * * @param phone new phone number for the contact * @param phoneType the type: cell, home, etc. * @return instance of ContactOperations */ public ContactOperations addPhone(String phone, int phoneType) { mValues.clear(); if (!TextUtils.isEmpty(phone)) { mValues.put(Phone.NUMBER, phone); mValues.put(Phone.TYPE, phoneType); mValues.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE); addInsertOp(); } return this; } /** * Adds a profile action * * @param userId the userId of the sample SyncAdapter user object * @return instance of ContactOperations */ public ContactOperations addProfileAction(long userId) { mValues.clear(); if (userId != 0) { mValues.put(SampleSyncAdapterColumns.DATA_PID, userId); mValues.put(SampleSyncAdapterColumns.DATA_SUMMARY, mContext .getString(R.string.profile_action)); mValues.put(SampleSyncAdapterColumns.DATA_DETAIL, mContext .getString(R.string.view_profile)); mValues.put(Data.MIMETYPE, SampleSyncAdapterColumns.MIME_PROFILE); addInsertOp(); } return this; } /** * Updates contact's email * * @param email email id of the sample SyncAdapter user * @param uri Uri for the existing raw contact to be updated * @return instance of ContactOperations */ public ContactOperations updateEmail(String email, String existingEmail, Uri uri) { if (!TextUtils.equals(existingEmail, email)) { mValues.clear(); mValues.put(Email.DATA, email); addUpdateOp(uri); } return this; } /** * Updates contact's name * * @param name Name of contact * @param existingName Name of contact stored in provider * @param nameType type of name: family name, given name, etc. * @param uri Uri for the existing raw contact to be updated * @return instance of ContactOperations */ public ContactOperations updateName(Uri uri, String existingFirstName, String existingLastName, String firstName, String lastName) { Log.i("ContactOperations", "ef=" + existingFirstName + "el=" + existingLastName + "f=" + firstName + "l=" + lastName); mValues.clear(); if (!TextUtils.equals(existingFirstName, firstName)) { mValues.put(StructuredName.GIVEN_NAME, firstName); } if (!TextUtils.equals(existingLastName, lastName)) { mValues.put(StructuredName.FAMILY_NAME, lastName); } if (mValues.size() > 0) { addUpdateOp(uri); } return this; } /** * Updates contact's phone * * @param existingNumber phone number stored in contacts provider * @param phone new phone number for the contact * @param uri Uri for the existing raw contact to be updated * @return instance of ContactOperations */ public ContactOperations updatePhone(String existingNumber, String phone, Uri uri) { if (!TextUtils.equals(phone, existingNumber)) { mValues.clear(); mValues.put(Phone.NUMBER, phone); addUpdateOp(uri); } return this; } /** * Updates contact's profile action * * @param userId sample SyncAdapter user id * @param uri Uri for the existing raw contact to be updated * @return instance of ContactOperations */ public ContactOperations updateProfileAction(Integer userId, Uri uri) { mValues.clear(); mValues.put(SampleSyncAdapterColumns.DATA_PID, userId); addUpdateOp(uri); return this; } /** * Adds an insert operation into the batch */ private void addInsertOp() { if (!mIsNewContact) { mValues.put(Phone.RAW_CONTACT_ID, mRawContactId); } mBuilder = newInsertCpo(addCallerIsSyncAdapterParameter(Data.CONTENT_URI), mYield); mBuilder.withValues(mValues); if (mIsNewContact) { mBuilder .withValueBackReference(Data.RAW_CONTACT_ID, mBackReference); } mYield = false; mBatchOperation.add(mBuilder.build()); } /** * Adds an update operation into the batch */ private void addUpdateOp(Uri uri) { mBuilder = newUpdateCpo(uri, mYield).withValues(mValues); mYield = false; mBatchOperation.add(mBuilder.build()); } public static ContentProviderOperation.Builder newInsertCpo(Uri uri, boolean yield) { return ContentProviderOperation.newInsert( addCallerIsSyncAdapterParameter(uri)).withYieldAllowed(yield); } public static ContentProviderOperation.Builder newUpdateCpo(Uri uri, boolean yield) { return ContentProviderOperation.newUpdate( addCallerIsSyncAdapterParameter(uri)).withYieldAllowed(yield); } public static ContentProviderOperation.Builder newDeleteCpo(Uri uri, boolean yield) { return ContentProviderOperation.newDelete( addCallerIsSyncAdapterParameter(uri)).withYieldAllowed(yield); } private static Uri addCallerIsSyncAdapterParameter(Uri uri) { return uri.buildUpon().appendQueryParameter( ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); } }
10. http://alvinalexander.com/java/jwarehouse/apps-for-android/SampleSyncAdapter/src/com/example/android/samplesync/platform/SampleSyncAdapterColumns.java.shtml
Android example source code file (SampleSyncAdapterColumns.java)
This example Android source code file (SampleSyncAdapterColumns.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Android by Example" TM.
The SampleSyncAdapterColumns.java Android example source code
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.example.android.samplesync.platform; import android.provider.ContactsContract.Data; /* * The standard columns representing contact's info from social apps. */ public interface SampleSyncAdapterColumns { /** * MIME-type used when storing a profile {@link Data} entry. */ public static final String MIME_PROFILE = "vnd.android.cursor.item/vnd.samplesyncadapter.profile"; public static final String DATA_PID = Data.DATA1; public static final String DATA_SUMMARY = Data.DATA2; public static final String DATA_DETAIL = Data.DATA3;
9. http://alvinalexander.com/java/jwarehouse/apps-for-android/SampleSyncAdapter/src/com/example/android/samplesync/platform/ContactManager.java.shtml
Android example source code file (ContactManager.java)
This example Android source code file (ContactManager.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Android by Example" TM.
The ContactManager.java Android example source code
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.example.android.samplesync.platform; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.StatusUpdates; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Im; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.util.Log; import com.example.android.samplesync.Constants; import com.example.android.samplesync.R; import com.example.android.samplesync.client.User; import java.util.List; /** * Class for managing contacts sync related mOperations */ public class ContactManager { /** * Custom IM protocol used when storing status messages. */ public static final String CUSTOM_IM_PROTOCOL = "SampleSyncAdapter"; private static final String TAG = "ContactManager"; /** * Synchronize raw contacts * * @param context The context of Authenticator Activity * @param account The username for the account * @param users The list of users */ public static synchronized void syncContacts(Context context, String account, List<User> users) { long userId; long rawContactId = 0; final ContentResolver resolver = context.getContentResolver(); final BatchOperation batchOperation = new BatchOperation(context, resolver); Log.d(TAG, "In SyncContacts"); for (final User user : users) { userId = user.getUserId(); // Check to see if the contact needs to be inserted or updated rawContactId = lookupRawContact(resolver, userId); if (rawContactId != 0) { if (!user.isDeleted()) { // update contact updateContact(context, resolver, account, user, rawContactId, batchOperation); } else { // delete contact deleteContact(context, rawContactId, batchOperation); } } else { // add new contact Log.d(TAG, "In addContact"); if (!user.isDeleted()) { addContact(context, account, user, batchOperation); } } // A sync adapter should batch operations on multiple contacts, // because it will make a dramatic performance difference. if (batchOperation.size() >= 50) { batchOperation.execute(); } } batchOperation.execute(); } /** * Add a list of status messages to the contacts provider. * * @param context the context to use * @param accountName the username of the logged in user * @param statuses the list of statuses to store */ public static void insertStatuses(Context context, String username, List<User.Status> list) { final ContentValues values = new ContentValues(); final ContentResolver resolver = context.getContentResolver(); final BatchOperation batchOperation = new BatchOperation(context, resolver); for (final User.Status status : list) { // Look up the user's sample SyncAdapter data row final long userId = status.getUserId(); final long profileId = lookupProfile(resolver, userId); // Insert the activity into the stream if (profileId > 0) { values.put(StatusUpdates.DATA_ID, profileId); values.put(StatusUpdates.STATUS, status.getStatus()); values.put(StatusUpdates.PROTOCOL, Im.PROTOCOL_CUSTOM); values.put(StatusUpdates.CUSTOM_PROTOCOL, CUSTOM_IM_PROTOCOL); values.put(StatusUpdates.IM_ACCOUNT, username); values.put(StatusUpdates.IM_HANDLE, status.getUserId()); values.put(StatusUpdates.STATUS_RES_PACKAGE, context .getPackageName()); values.put(StatusUpdates.STATUS_ICON, R.drawable.icon); values.put(StatusUpdates.STATUS_LABEL, R.string.label); batchOperation .add(ContactOperations.newInsertCpo( StatusUpdates.CONTENT_URI, true).withValues(values) .build()); // A sync adapter should batch operations on multiple contacts, // because it will make a dramatic performance difference. if (batchOperation.size() >= 50) { batchOperation.execute(); } } } batchOperation.execute(); } /** * Adds a single contact to the platform contacts provider. * * @param context the Authenticator Activity context * @param accountName the account the contact belongs to * @param user the sample SyncAdapter User object */ private static void addContact(Context context, String accountName, User user, BatchOperation batchOperation) { // Put the data in the contacts provider final ContactOperations contactOp = ContactOperations.createNewContact(context, user.getUserId(), accountName, batchOperation); contactOp.addName(user.getFirstName(), user.getLastName()).addEmail( user.getEmail()).addPhone(user.getCellPhone(), Phone.TYPE_MOBILE) .addPhone(user.getHomePhone(), Phone.TYPE_OTHER).addProfileAction( user.getUserId()); } /** * Updates a single contact to the platform contacts provider. * * @param context the Authenticator Activity context * @param resolver the ContentResolver to use * @param accountName the account the contact belongs to * @param user the sample SyncAdapter contact object. * @param rawContactId the unique Id for this rawContact in contacts * provider */ private static void updateContact(Context context, ContentResolver resolver, String accountName, User user, long rawContactId, BatchOperation batchOperation) { Uri uri; String cellPhone = null; String otherPhone = null; String email = null; final Cursor c = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] {String.valueOf(rawContactId)}, null); final ContactOperations contactOp = ContactOperations.updateExistingContact(context, rawContactId, batchOperation); try { while (c.moveToNext()) { final long id = c.getLong(DataQuery.COLUMN_ID); final String mimeType = c.getString(DataQuery.COLUMN_MIMETYPE); uri = ContentUris.withAppendedId(Data.CONTENT_URI, id); if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) { final String lastName = c.getString(DataQuery.COLUMN_FAMILY_NAME); final String firstName = c.getString(DataQuery.COLUMN_GIVEN_NAME); contactOp.updateName(uri, firstName, lastName, user .getFirstName(), user.getLastName()); } else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) { final int type = c.getInt(DataQuery.COLUMN_PHONE_TYPE); if (type == Phone.TYPE_MOBILE) { cellPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBER); contactOp.updatePhone(cellPhone, user.getCellPhone(), uri); } else if (type == Phone.TYPE_OTHER) { otherPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBER); contactOp.updatePhone(otherPhone, user.getHomePhone(), uri); } } else if (Data.MIMETYPE.equals(Email.CONTENT_ITEM_TYPE)) { email = c.getString(DataQuery.COLUMN_EMAIL_ADDRESS); contactOp.updateEmail(user.getEmail(), email, uri); } } // while } finally { c.close(); } // Add the cell phone, if present and not updated above if (cellPhone == null) { contactOp.addPhone(user.getCellPhone(), Phone.TYPE_MOBILE); } // Add the other phone, if present and not updated above if (otherPhone == null) { contactOp.addPhone(user.getHomePhone(), Phone.TYPE_OTHER); } // Add the email address, if present and not updated above if (email == null) { contactOp.addEmail(user.getEmail()); } } /** * Deletes a contact from the platform contacts provider. * * @param context the Authenticator Activity context * @param rawContactId the unique Id for this rawContact in contacts * provider */ private static void deleteContact(Context context, long rawContactId, BatchOperation batchOperation) { batchOperation.add(ContactOperations.newDeleteCpo( ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), true).build()); } /** * Returns the RawContact id for a sample SyncAdapter contact, or 0 if the * sample SyncAdapter user isn't found. * * @param context the Authenticator Activity context * @param userId the sample SyncAdapter user ID to lookup * @return the RawContact id, or 0 if not found */ private static long lookupRawContact(ContentResolver resolver, long userId) { long authorId = 0; final Cursor c = resolver.query(RawContacts.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {String.valueOf(userId)}, null); try { if (c.moveToFirst()) { authorId = c.getLong(UserIdQuery.COLUMN_ID); } } finally { if (c != null) { c.close(); } } return authorId; } /** * Returns the Data id for a sample SyncAdapter contact's profile row, or 0 * if the sample SyncAdapter user isn't found. * * @param resolver a content resolver * @param userId the sample SyncAdapter user ID to lookup * @return the profile Data row id, or 0 if not found */ private static long lookupProfile(ContentResolver resolver, long userId) { long profileId = 0; final Cursor c = resolver.query(Data.CONTENT_URI, ProfileQuery.PROJECTION, ProfileQuery.SELECTION, new String[] {String.valueOf(userId)}, null); try { if (c != null && c.moveToFirst()) { profileId = c.getLong(ProfileQuery.COLUMN_ID); } } finally { if (c != null) { c.close(); } } return profileId; } /** * Constants for a query to find a contact given a sample SyncAdapter user * ID. */ private interface ProfileQuery { public final static String[] PROJECTION = new String[] {Data._ID}; public final static int COLUMN_ID = 0; public static final String SELECTION = Data.MIMETYPE + "='" + SampleSyncAdapterColumns.MIME_PROFILE + "' AND " + SampleSyncAdapterColumns.DATA_PID + "=?"; } /** * Constants for a query to find a contact given a sample SyncAdapter user * ID. */ private interface UserIdQuery { public final static String[] PROJECTION = new String[] {RawContacts._ID}; public final static int COLUMN_ID = 0; public static final String SELECTION = RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "' AND " + RawContacts.SOURCE_ID + "=?"; } /** * Constants for a query to get contact data for a given rawContactId */ private interface DataQuery { public static final String[] PROJECTION = new String[] {Data._ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3,}; public static final int COLUMN_ID = 0; public static final int COLUMN_MIMETYPE = 1; public static final int COLUMN_DATA1 = 2; public static final int COLUMN_DATA2 = 3; public static final int COLUMN_DATA3 = 4; public static final int COLUMN_PHONE_NUMBER = COLUMN_DATA1; public static final int COLUMN_PHONE_TYPE = COLUMN_DATA2; public static final int COLUMN_EMAIL_ADDRESS = COLUMN_DATA1; public static final int COLUMN_EMAIL_TYPE = COLUMN_DATA2; public static final int COLUMN_GIVEN_NAME = COLUMN_DATA2; public static final int COLUMN_FAMILY_NAME = COLUMN_DATA3; public static final String SELECTION = Data.RAW_CONTACT_ID + "=?"; } }
11. http://www.telerik.com/platform#overview
12. How to build a mobile app with an App Engine backend (Tutorial)
https://cloud.google.com/developers/articles/how-to-build-mobile-app-with-app-engine-backend-tutorial
java and networking
http://docs.oracle.com/javase/tutorial/networking/overview/networking.html
http://docs.oracle.com/javase/tutorial/networking/
http://www.tutorialspoint.com/java/java_networking.htm
No comments:
Post a Comment