Skip to content

Archive for

29
Apr

How to use SQLite to store data for your Android app


sqlite-and-Android

Most Android apps will need to persist user data at sometime. There are different ways to store user data, but SQLite databases are a very convenient and speedy method of saving user (or app) data and information.

SQLite is an opensource SQL database that stores the database as a text file on a device. Basic familiarity with SQL sets up a developer nicely to use Android’s sqlite implementation. And for developers not familiar with SQL, do not be discouraged, SQL is pretty straightforward to learn, use and implement. SQLite is a relational database management system just like Oracle, MySQL and PostgreSQL. Due to its small footprint and public domain license, it is possibly the most widely deployed database engine in the world, it can be found in all types of software ranging from embedded systems, browsers, and operating systems.

Android has a built in SQLite implementation, and application specific database files are stored in a private disk space that’s inaccessible to other applications. This way, no application can access another application’s data.

Preparation

The complete source code for this tutorial is available on GitHub.

The sample application for this tutorial shows how to create a database, named “SQLiteExample.db”, that contains a single table named “person”. This table stores Person data, including his name, gender and age.

There are two Activities, MainActivity, which shows a list of stored Person names, and CreateOrEditActivity, which allows adding and editing Person details.

The most important class, in our sample, is the ExampleDBHelper class, which extends SQLiteOpenHelper. SQLiteOpenHelper is a helper class designed to manage database creation and version management. You override onCreate() and onUpgrade() methods, and whenever a new database is created or upgraded, the appropriate method gets invoked.

ExampleDBHelper is where all the SQLite operations are carried out, and both MainActivity and CreateOrEditActivity call methods from this class to view, create, update or delete data from the database.

Extending “SQLiteOpenHelper”

We create a class, called ExampleDBHelper, that extends SQLiteOpenHelper. We begin by defining the database, tables and columns as constants. This is always a good idea. If any of these names get changed, rather than hunting through the source for all occurrences, we simply change it once. Take special notice of the column called “_id” (PERSON_COLUMN_ID). This column has special significance which will be discussed below.

public static final String DATABASE_NAME = "SQLiteExample.db";
private static final int DATABASE_VERSION = 1;
public static final String PERSON_TABLE_NAME = "person";
public static final String PERSON_COLUMN_ID = "_id";
public static final String PERSON_COLUMN_NAME = "name";
public static final String PERSON_COLUMN_GENDER = "gender";
public static final String PERSON_COLUMN_AGE = "age";

In the constructor, we call SQLiteOpenHelper’s constructor, passing it the application context, the database name, an SQLiteDatabase.CursorFactory (we actually pass a null object here), and the database version. This constructor handles the creation or upgrade of the database. The database version should begin from 1, and increase linearly, whenever you modify the database schema.

public ExampleDBHelper(Context context) 
    super(context, DATABASE_NAME , null, DATABASE_VERSION);

The onCreate() is called whenever a new database is created. Here, you specify each table schema. In our example app, we have only one table.

@Override
public void onCreate(SQLiteDatabase db) 
    db.execSQL("CREATE TABLE " + PERSON_TABLE_NAME + "(" + 
        PERSON_COLUMN_ID + " INTEGER PRIMARY KEY, " +
        PERSON_COLUMN_NAME + " TEXT, " +
        PERSON_COLUMN_GENDER + " TEXT, " +
        PERSON_COLUMN_AGE + " INTEGER)"
    );

The overridden onUpgrade() method is called whenever the database needs to be upgraded (i.e. when the version has changed). Here, you should drop and/or add tables, or migrate data to new tables, or whatever else needs to be done to move from the previous database schema to the new schema. In our example, we simply drop the existing “person” table, and then call onCreate() to recreate it. I doubt you would want to do this with real user data.

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    db.execSQL("DROP TABLE IF EXISTS " + PERSON_TABLE_NAME);
    onCreate(db);

For the sample application, we want the ExampleDBHelper class to handle all data insertion, deletion, updates and views (basically all queries to the database must be through ExampleDBHelper). So we define appropriate methods for each of these scenarios.

To insert a new Person, we use the creatively named insertPerson() method. We use the SQLiteOpenHelper method getWritableDatabase() to get an SQLiteDatabase object reference to our already created database. The Person details are stored in a ContentValues object, with the appropriate column name as key, and corresponding data as value. We then call SQLiteDatabase’s insert method with the person table name, and the ContentValues object. NOTE that we left out the PERSON_COLUMN_ID column, which was specified as a primary key. It automatically increments.

public boolean insertPerson(String name, String gender, int age) 
    SQLiteDatabase db = getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(PERSON_COLUMN_NAME, name);
    contentValues.put(PERSON_COLUMN_GENDER, gender);
    contentValues.put(PERSON_COLUMN_AGE, age);
    db.insert(PERSON_TABLE_NAME, null, contentValues);
    return true;

create_person
To update a person, we created an updatePerson() method. It is similar to the createPerson() method. The equivalent SQL statement to update a person row would be “UPDATE person SET name=’name’ and gender=’gender’ and age=’age’ WHERE ID=’id’“. The SQLiteDatabase update method is a convenient method for updating rows in a table. It is defined as: public int update (String table, ContentValues values, String whereClause, String[] whereArgs), where the whereClause represents the optional where clause, and whereArgs is a String[] of values that would replace the “?’s” included in the whereClause. Passing a null value as the whereClause will update all rows.

public boolean updatePerson(Integer id, String name, String gender, int age) 
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(PERSON_COLUMN_NAME, name);
    contentValues.put(PERSON_COLUMN_GENDER, gender);
    contentValues.put(PERSON_COLUMN_AGE, age);
    db.update(PERSON_TABLE_NAME, contentValues, PERSON_COLUMN_ID + " = ? ", new String[]  Integer.toString(id)  );
    return true;

android_sqlite_edit_person
We implemented two methods to view person’s in the database. The first retrieves a single person, given his id, and the other retrieves all persons. Since we are not writing to the database, we retrieve a readable database with getReadableDatabase(), and perform a rawQuery(). RawQuery takes a SQL query string, with optional queryArgs and returns a Cursor object. A Cursor provides access to the result set returned. A Cursor can be transversed forward, backwards or randomly. Cursor also provides methods to retrieve particular columns, total columns, total rows and much much more.

public Cursor getPerson(int id) 
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery( "SELECT * FROM " + PERSON_TABLE_NAME + " WHERE " +
        PERSON_COLUMN_ID + "=?", new String[]  Integer.toString(id)  );
    return res;

public Cursor getAllPersons() 
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery( "SELECT * FROM " + PERSON_TABLE_NAME, null );
    return res;

Deleting data is also pretty straightforward. SQLiteDatabase has a delete() method that takes the table name to delete from, and optional whereClause and whereArgs. NOTE: Be very careful when writing this, as passing null in the whereClause would delete all rows.

public Integer deletePerson(Integer id) 
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(PERSON_TABLE_NAME,
        PERSON_COLUMN_ID + " = ? ",
        new String[]  Integer.toString(id) );

android_sqlite_delete_person

Integrating the “Helper” with the rest of the app

At this point, we have completely prepared our database for use. To integrate this with both our activities, we initialize ExampleDBHelper in each Activity onCreate() method, and then call the appropriate method, depending on what action is required.

In MainActivity, we display a list of all persons using a ListView. Clicking on the “Add New” button starts CreateOrEditActivity in create mode, allowing us to create a new person. While clicking on any list item starts CreateOrEditActivity in edit mode, allowing us delete or edit and update the person info.

To display the list of persons, we request a Cursor containing all person records. We then use a SimpleCursorAdapter instance for displaying the list items. Do you remember the special column named “_id” mentioned above? SimpleCursorAdapter requires this column, or else it would not work. To use the SimpleCursorAdapter, we define a layout view for each list item called person_info.xml.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<TextView
    android:id="@+id/personID"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="@dimen/activity_vertical_margin"
    android:textSize="@dimen/text_size"/>

<TextView
    android:id="@+id/personName"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:padding="@dimen/activity_vertical_margin"
    android:textSize="@dimen/text_size"/>

</LinearLayout>

All the magic in MainActivity happens in the onCreate() method. We get a dbHelper object, request for all person’s, and populate the ListView with the received Cursor. Finally, we implement the onItemClickListener() so that when a person is clicked, we get the person ID and parse it as an extra to CreateOrEditActivity.
The complete MainActivity code follows:

public class MainActivity extends ActionBarActivity 
    public final static String KEY_EXTRA_CONTACT_ID = "KEY_EXTRA_CONTACT_ID";

    private ListView listView;
    ExampleDBHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.addNew);
        button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Intent intent = new Intent(MainActivity.this, CreateOrEditActivity.class);
                intent.putExtra(KEY_EXTRA_CONTACT_ID, 0);
                startActivity(intent);
            
        );

        dbHelper = new ExampleDBHelper(this);

        final Cursor cursor = dbHelper.getAllPersons();
        String [] columns = new String[] 
                ExampleDBHelper.PERSON_COLUMN_ID,
                ExampleDBHelper.PERSON_COLUMN_NAME
        ;
        int [] widgets = new int[] 
                R.id.personID,
                R.id.personName
        ;

        SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.person_info,
                cursor, columns, widgets, 0);
        listView = (ListView)findViewById(R.id.listView1);
        listView.setAdapter(cursorAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 

            @Override
            public void onItemClick(AdapterView listView, View view,
                                    int position, long id) 
                Cursor itemCursor = (Cursor) MainActivity.this.listView.getItemAtPosition(position);
                int personID = itemCursor.getInt(itemCursor.getColumnIndex(ExampleDBHelper.PERSON_COLUMN_ID));
                Intent intent = new Intent(getApplicationContext(), CreateOrEditActivity.class);
                intent.putExtra(KEY_EXTRA_CONTACT_ID, personID);
                startActivity(intent);
            
        );

    


CreateOrEditActivity is a little bit more involved. The Activity allows creating, editing and deleting persons. It also changes its UI based on what action is to be performed. Because of it’s length, we shall only show and discuss the parts relevant to database interaction.

In onCreate(), if we receive a personID, we call dbHelper.getPerson() with that ID, and then populate the fields with the person details:

Cursor rs = dbHelper.getPerson(personID);
            rs.moveToFirst();
            String personName = rs.getString(rs.getColumnIndex(ExampleDBHelper.PERSON_COLUMN_NAME));
            String personGender = rs.getString(rs.getColumnIndex(ExampleDBHelper.PERSON_COLUMN_GENDER));
            int personAge = rs.getInt(rs.getColumnIndex(ExampleDBHelper.PERSON_COLUMN_AGE));
            if (!rs.isClosed()) 
                rs.close();
            

If the delete button is clicked, we call dbHelper.delete() with the personID

case R.id.deleteButton:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(R.string.deletePerson)
                        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int id) 
                                dbHelper.deletePerson(personID);
                                Toast.makeText(getApplicationContext(), "Deleted Successfully", Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                startActivity(intent);
                            
                        )
                        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() 
                            public void onClick(DialogInterface dialog, int id) 
                                // User cancelled the dialog
                            
                        );
                AlertDialog d = builder.create();
                d.setTitle("Delete Person?");
                d.show();
                return;

Finally, we implemented a persistPerson() method that checks if we require a person creation or update.

    public void persistPerson() 
        if(personID > 0) 
            if(dbHelper.updatePerson(personID, nameEditText.getText().toString(),
                    genderEditText.getText().toString(),
                    Integer.parseInt(ageEditText.getText().toString()))) 
                Toast.makeText(getApplicationContext(), "Person Update Successful", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            
            else 
                Toast.makeText(getApplicationContext(), "Person Update Failed", Toast.LENGTH_SHORT).show();
            
        
        else 
            if(dbHelper.insertPerson(nameEditText.getText().toString(),
                    genderEditText.getText().toString(),
                    Integer.parseInt(ageEditText.getText().toString()))) 
                Toast.makeText(getApplicationContext(), "Person Inserted", Toast.LENGTH_SHORT).show();
            
            else
                Toast.makeText(getApplicationContext(), "Could not Insert person", Toast.LENGTH_SHORT).show();
            
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        
    

Conclusion

Extending SQliteOpenHelper helps you abstract the database creation, updates and maintenance, so you can focus on interacting with the database. We used different methods to interact with the database, including helper methods, and plain SQL commands.

While this sample app creates a simple one-table database, SQLite is a complete relational database system, and supports more advanced features including multiple tables, foreign keys, complex queries with joins and more. Using SQLite in your android app is a fast, secure, efficient and easy way to persist user and app data.

The complete source code for this tutorial is available on GitHub.

Android Developer Newsletter

Do you want to know more? Subscribe to our Android Developer Newsletter. Just type in your email address below to get all the top developer news, tips & links once a week in your inbox:
Email:

PS. No spam, ever. Your email address will only ever be used for Android Dev Weekly.



29
Apr

LG reports strong Q1 profits as mobile sales strengthen


lg logo mwc 2015 2

LG Electronics has just announced its unaudited financial results for the first quarter of 2015 and it’s a particularly strong start to the year for the company’s communications (smartphone) division.

In total, LG posted a first quarter net profit of KRW 38.4 billion (USD 34.91 million) and an operating profit of KRW 305.2 billion (USD 277.45 million), both of which are up from the previous quarter. However, revenues remained stagnant compared with the first quarter of 2014, stuck at KRW 13.99 trillion (USD 12.72billion). The reason for this is a decline in revenue generated by LG TVs, but soaring smartphone sales have helped to offset this.

LG smartphone shipments grew by 26 percent year-on-year

Looking specifically at mobile, sales revenue is up 5 percent from the same quarter last year, reaching KRW 3.6 trillion (USD 3.27 billion). Smartphone shipments grew by an impressive 26 percent over the last 12 months, reaching 15.4 million units this quarter. North America was the biggest growth region for LG, with a 66 percent shipment increase compared with last year. Korea saw a similarly impressive 57 percent growth in sales, thanks to the popularity of the rather unique LG G Flex 2.

As for the rest of the business, the Home Entertainment Company saw first quarter operating profits decline by 5 percent year on year KRW 4.44 trillion (USD 4.03billion), while its home appliance company saw a year-on-year gain of 9 percent to KRW 229.3 billion (USD 208.45 million). Finally, LG’s Vehicle Component Company, a relatively new division setup in July 2013, recorded revenues of KRW 382.6 billion (USD 347.82 million) and an operating loss of KRW 2.4 billion (USD 2.18 million).

Overall, LG looks to be continuing to build on its success in the mobile market, having released a strong line-up of high-end and mid-range products for various markets. The mobile division is growing particularly well, although the competitive nature of the market appears to be taking some toll on LG’s margins.

With the newly unveiled LG G4 set to hit the global market in June, we’ll have to wait for the company’s third quarter results to judge the impact of this year’s flagship.

Recent LG products:

.rvs_wrapper
width: 335px;

.rvs_wrapper.align_left
float: left;

.rvs_wrapper.align_right
float: right;

.rvs_wrapper.align_center,
.rvs_wrapper.align_none
width: 100%;

.rvs_wrapper.align_center
text-align: center;

.rvs_wrapper.align_center.cbc-latest-videos ul li
float: none;
display: inline-block;
vertical-align: top;

.rvs_wrapper.cbc-latest-videos:not(.align_none) ul li:nth-child(2n+1)
clear: both;

.rvs_title
font-weight: 600 !important;
margin: 0 !important;

.rvs_wrapper.align_right .rvs_title
padding-left: 20px;

.rvs_title a
font-family: ‘Roboto Condensed’;
color: #3a3a3a;

.rvs_wrapper.cbc-latest-videos ul
padding-top: 10px;

.rvs_wrapper.align_left.cbc-latest-videos ul li,
.rvs_wrapper.align_none.cbc-latest-videos ul li
padding: 0 15px 0 0;

.rvs_wrapper.align_right.cbc-latest-videos ul li
padding: 0 0 0 15px;
float: right;

.rvs_wrapper.align_center.cbc-latest-videos ul li
padding: 0 7px;

.rvs_wrapper.cbc-latest-videos ul li > a
font-weight: 400;

.rvs_wrapper.cbc-latest-videos ul li > a .yt-thumbnail
margin-bottom: 0;

@media only screen and (max-width : 480px)
.rvs_wrapper
width: 100%;
text-align: center;

#page .rvs_wrapper.cbc-latest-videos ul li
padding: 0 7px;
display: inline-block;
float: none;
vertical-align: top;

3

3
29
Apr

Samsung is again the world’s top smartphone seller


samsung logo mwc 2015 6

Samsung has recovered the top position in the global smartphone market, according to a Strategy Analytics report covering Q1 2015.

Samsung has lost the sales leadership to Apple in Q4 2014, according to some research firms, while in Strategy Analytics’ estimation the two companies tied for the first place with a 19.6 percent market share. Blowout iPhone 6 sales have helped Apple interrupt Samsung’s years-long run at the top, but it didn’t take long for Samsung to recover.

Samsung has shipped an estimate 83.2 million smartphones in Q1 2015, compared to 74.5 million in the previous quarter. Combined with Apple’s slowdown (61.2 million, compared to 74.5 million in the previous quarter), that gave Samsung a market share of 24.1 percent, a significant lead over Apple’s 17.7 percent.

strategy analytics market share q1 2015 2

Samsung’s jump comes despite the fact that Q1 is typically slower than Q4, and despite of strong competition from Apple at the high-end, and Chinese brands in the mid- and low-end.

Coming in third in Strategy Analytics’ ranking is LenovoMotorola with 5.4 percent, while Huawei ranked fourth, with 5 percent. All other players are lumped in the “others” group (47.7 percent).

Looking at the shifts in market shares quarter over quarter, Samsung is the only top player that has gained share, seemingly at the expense of everyone else. That’s good news for the embattled company, though Samsung also needs the average selling price of its phones to increase in order to return to growth. Samsung just announced its Q1 2015 results today, and ASP has actually decreased, which took its toll on revenue.

All eyes are now on the performance of the Galaxy S6 and S6 Edge. Signs are very positive so far, so Samsung will likely preserve its dominance in the quarters to come. But while profits may recover as well, it’s safe to say that the days of explosive growth are over for Samsung.



29
Apr

Movie streaming service Popcorn Time blocked by UK court


Popcorn Time

Popcorn Time has painted a rather large target on its back with its movie-streaming service. Due to its questionable legality, movie studios have sought to block the service, but a shift to Bittorrent-based distribution has allowed it to continue operating while Hollywood scrambles a response. One place the studios have been able to deal a blow, however, is in the UK, where they’ve managed to restrict access to the original Popcorn Time client.

The High Court yesterday ruled that five of the UK’s biggest broadband providers begin blocking five websites offering the streaming software for download. Sky, BT, EE, TalkTalk and Virgin Media will all be forced to comply, just as they have with popular Bittorrent websites like ThePirateBay (even if those blocks have later been rendered useless).

Although Popcorn Time is indifferent about its legal position, the judge had no issue calling out its real motive. “It is manifest that the Popcorn Time application is used in order to watch pirated content on the internet and indeed it is also manifest that that is its purpose,” notes Judge Briss. “No-one really uses Popcorn Time in order to watch lawfully available content.”

As none of the ISPs opposed the order, it’s only a matter of time until popcorntime.io, flixtor.me, popcorn-time.se, and isoplex.isohunt.to are blocked. However, because the service operates using P2P protocols, those already using the software shouldn’t experience any issues. When torrent sites like Kickass Torrents and EZTV were restricted in the UK, hundreds of websites sprung up in their place and proxy sites helped users evade the blocks on the original websites. It’s safe to assume the same will happen here.

Filed under: Internet, Software

Comments

Via: Variety

Source: High Court of Justice (.doc)

29
Apr

Dark tattoos can throw off Apple Watch’s heart rate sensor


Here’s one factor to take into account if you’re still undecided about getting the Apple Watch: it doesn’t seem to play well with tattoos. Several users revealed online that their devices act wonky when worn on a tattooed arm. The heart rate sensor wouldn’t read their pulse, and the watch wouldn’t detect direct contact with the skin, causing apps to stop working and repeatedly ask for the passcode. To confirm if inked skin really does affect the smartwatch’s functions, iMore has decided to perform a series of tests. “[W]e’re inclined to agree with those early reports,” the publication writes, “if your tattoo happens to be a solid, darker color.”

iMore has discovered that dark colors like black and red affect readings the most to the point that the watch can’t even register being in contact with skin. Lighter colors cause some heart rate misreadings, as well, but they don’t render the watch useless. It makes sense when you think of how the sensor works. See, in order to read your heart rate, the Apple Watch flashes green LED lights hundreds of times per second. Since red blood absorbs green light, the device can detect the amount of blood flowing through your pulse when the LEDs flash. The presence of ink that blocks light can then hinder the sensor’s ability to detect skin and the amount of blood flowing underneath.

You can switch off “Wrist Detection” to prevent the device from asking for a passcode every time the screen comes on. However, that solution isn’t perfect: for one, it switches off Apple Pay, as well. Of course, you can always wear the watch on your other arm if it’s not tattooed, but you can also just wait for the next iteration if an update can’t fix the issue.

[Image credit: Michael Lovell @ YouTube]

Filed under: Wearables, Mobile, Apple

Comments

Source: Michael Lovell @ YouTube, iMore

29
Apr

Google will tell you who you local General Election candidates are


Polling Station

The manifestos are out and party leaders are busy touring the country. Even tech companies are doing what they can to help you choose a side ahead of next month’s General Election. Twitter rolled out its political emoji, lovingly referred to as “hashflags”, earlier this month, but Google’s just launched a valuable resource that tells you all of the election candidates in your area. If you pull up a Google search and enter the words “who is on the uk ballot,” the search giant will ask you to enter your postcode or constituency before displaying an alphabetic list of all the candidates gunning for your vote. As expected, the 2015 Election campaign has been the most web-friendly yet — it’s just a shame online voting won’t happen any time soon.

Google Election Ballot

[Image credit: acme, Flickr]

Filed under: Internet, Google

Comments

Source: Google

29
Apr

Debt repayment issues dictate that Ouya needs to find a buyer quickly


OUYA-Console-set-h

It was only a couple of years ago that it was the darling of Kickstarter, blowing past its target goal of $950,000 with surprising ease and ending up with over eight and a half million dollars in funding. The start-up in question is Ouya, manufacturer of the Android micro gaming console, and thanks to a leaked memo from its CEO, Julie Uhrman, it would seem that the company has hit choppy waters as it now seeks a buyer.

After its Kickstarter campaign, Ouya went on to secure further funding from investors such as Kleiner Perkins, Nvidia and Shasta Ventures among others, one of which was an investment company TriplePoint. Now it seems that its time for Ouya to repay the venture capital. It’s unknown just how much capital TriplePoint invested, but given that Alibaba recently invested $10 million in Ouya, it must be a significant amount.

It is unclear exactly how much was lent by TriplePoint, except that it must have been more than the $10 million that OUYA raised just two months ago from Alibaba. Debt restructuring negotiations were unsuccessful. In her memo, Uhrman writes: “Given our debtholder’s timeline, the process will be quick. We are looking for expressions of interest by the end of this month.”

The investment bank, Mesa Global, has been hired to manage the process of looking for a buyer. Are you surprised at Ouya’s predicament? With the recent release of Android TV, has opportunity passed Ouya by?

 

Source: Fortune

Come comment on this article: Debt repayment issues dictate that Ouya needs to find a buyer quickly

29
Apr

DORA offers a realistic telepresence experience through Oculus Rift


Many commercial telepresence robots are merely screens or iPads on moving platforms. DORA (Dexterous Observational Roving Automaton), however, promises to make users feel like they’ve been transported to another location when it does become available. The system was created by a team of University of Pennsylvania roboticists who want to provide people a more immersive telepresence experience without draining their bank accounts. Their robot is paired with an Oculus Rift headset, which can track the user’s head movements and orientation, whether up/down, left/right or forward/backward. That data is wirelessly transmitted to the robot’s Arduino and Intel Edison microcontrollers, prompting its camera-equipped head to follow the user’s movements.

Here’s how one of DORA’s creators, Emre Tanirgan, describes the experience:

You feel like you are transported somewhere else in the real world as opposed to a simulated environment. You actually get to see people interacting with you, as if you were actually there, and it’s difficult to recreate the same experience in a virtual environment right now.

Done right, the setup can make you feel like you’re really in the meeting room, the office or wherever the telepresence robot is. However, perfecting the system hasn’t been easy for the roboticists, who are still trying to reduce the lag time between the user’s movements and what’s shown on screen. The current lag time is around 70 milliseconds, and shifting to WiFi or 4G from using radio link for the wireless data transfer could increase it even more. That’s why the team’s aiming to bring it down below 60 ms, since too much lag could lead to motion sickness.

Once DORA’s ready for deployment, the team will first make it available to museums offering virtual tours and emergency responders. After them, ordinary consumers could come next, though that obviously wouldn’t happen anytime soon.

https://player.vimeo.com/video/124993083?color=f51128&byline=0&portrait=0

https://player.vimeo.com/video/125286769?color=f51128&byline=0&portrait=0

Filed under: Robots

Comments

Via: IEEE

29
Apr

Now available, Dell Venue 10 7000 starts at $499


Dell Venue 10 7000

We recently took a look at Dell‘s newest line of Android tablets, including the Venue 10 7000 and the Venue 8 7000. We even took the 8-inch tablet for a test spin, which we found to be a solid offering from a company we do not usually associate with tablets.

Starting today, the 10-inch version, the Dell Venue 10 7000, is up for sale starting at $499.

Taking the approach that the Venue 8 is for play, the Venue 10 7000 is being promoted as the Android tablet you need for your work place. It even has an optional attachable keyboard dock, not unlike what you would find in the ASUS Transformer line of tablets.

Dell Venue 10 7000 and keyboard

Equipped with a 10.5-inch display at 2560 x 1600 resolution, this Intel Atom Z3580 powered tablet offers 2GB of RAM, 16GB or 32GB of internal storage expandable up to 512GB through a micro USB card reader, and runs Android 5.0 Lollipop.

The Dell Venue 10 7000 is priced fairly competitively, but is not in impulse buy territory. $499.00 will get you the base tablet with 16GB of storage. Adding the keyboard dock bumps things up to $629.00, and to get your hands on the 32GB model, which is only available with the keyboard dock, you are looking at $679.00. That’s laptop territory.

If you are interested in picking up the Venue 10 7000, head on over to the Dell website for more details.

What do you say, is a Dell Venue 10 7000 in your future?

This article originally appeared on our sister site TabTimes.



29
Apr

Marilyn Manson released his latest album on early PlayStation CDs


Marilyn Manson at a concert in February 2015

The ’90s are back in style, in more ways than one. Kill Screen has revealed that Marilyn Manson released his latest album (The Pale Emperor) on the black CDs used for original PlayStation games, made in the same Sony plant. No, they’re not meant to rekindle two of your fondest teenage memories. Manson’s art directors chose these discs because they help underscore the album’s themes of darkness and light. They start out pitch black, but a newly-added thermal layer turns them white when you play them — clever, isn’t it? With that said, you’ll probably have a hard time appreciating this thematic trick. While you might still be a Marilyn Manson fan, the odds are that you ditched CD-based music a while ago.

[Image credit: Daniel Boczarski/Getty Images]

Filed under: Gaming, Storage, Sony

Comments

Via: Billboard, NME

Source: Kill Screen