You can use ContentProviders to share data from one app to another.For instance by creating a Content provider class in your application which can hold image metadata items. We will use a local SQLite database to store the data, but you can use any where you like to store the data.
First create an ImagesProvider class extending ContentProvider class and overriding the following methods.
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
public class ImagesProvider extends ContentProvider {
private static final String PROVIDER_NAME = "androidcontentproviderdemo.androidcontentprovider.images";
private static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/images");
private static final int IMAGES = 1;
private static final int IMAGE_ID = 2;
private static final UriMatcher uriMatcher = getUriMatcher();
private static UriMatcher getUriMatcher() {
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "images", IMAGES);
uriMatcher.addURI(PROVIDER_NAME, "images/#", IMAGE_ID);
return uriMatcher;
}
private ImageDatabase imageDataBase = null;
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case IMAGES:
return "vnd.android.cursor.dir/vnd.com.androidcontentproviderdemo.androidcontentprovider.provider.images";
case IMAGE_ID:
return "vnd.android.cursor.item/vnd.com.androidcontentproviderdemo.androidcontentprovider.provider.images";
}
return "";
}
@Override
public boolean onCreate() {
Context context = getContext();
imageDataBase = new ImageDatabase(context);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Query is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.getImages(id, projection, selection, selectionArgs, sortOrder);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
try {
long id = imageDataBase.addNewImage(values);
Uri returnUri = ContentUris.withAppendedId(CONTENT_URI, id);
return returnUri;
} catch(Exception e) {
return null;
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Delete is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.deleteImages(id);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
String id = null;
if(uriMatcher.match(uri) == IMAGE_ID) {
//Update is for one single image. Get the ID from the URI.
id = uri.getPathSegments().get(1);
}
return imageDataBase.updateImages(id, values);
}
}
To store the content we will need a database helper class for our content provider. Create an ImageDataBase class as follows
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import java.sql.SQLException;
public class ImageDataBase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "ImagesDatabase.db";
private static final String TABLE_NAME = "imagestore";
private static final String SQL_CREATE = "CREATE TABLE " + TABLE_NAME +
" (_id INTEGER PRIMARY KEY, IMAGETITLE TEXT , IMAGEURL TEXT , IMAGEDESC TEXT )";
private static final String SQL_DROP = "DROP TABLE IS EXISTS " + TABLE_NAME ;
ImageDataBase(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(SQL_DROP);
onCreate(db);
}
public Cursor getImages(String id, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
sqliteQueryBuilder.setTables(TABLE_NAME);
if(id != null) {
sqliteQueryBuilder.appendWhere("_id" + " = " + id);
}
if(sortOrder == null || sortOrder == "") {
sortOrder = "IMAGETITLE";
}
Cursor cursor = sqliteQueryBuilder.query(getReadableDatabase(),
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
return cursor;
}
public long addNewImage(ContentValues values) throws SQLException {
long id = getWritableDatabase().insert(TABLE_NAME, "", values);
if(id <=0 ) {
throw new SQLException("Failed to add an image");
}
return id;
}
public int deleteImages(String id) {
if(id == null) {
return getWritableDatabase().delete(TABLE_NAME, null , null);
} else {
return getWritableDatabase().delete(TABLE_NAME, "_id=?", new String[]{id});
}
}
public int updateImages(String id, ContentValues values) {
if(id == null) {
return getWritableDatabase().update(TABLE_NAME, values, null, null);
} else {
return getWritableDatabase().update(TABLE_NAME, values, "_id=?", new String[]{id});
}
}
}
Declaring your content provider in the AndroidManifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidcontentproviderdemo.androidcontentprovider">
<application android:allowBackup="true" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
<provider android:name="com.androidcontentproviderdemo.androidcontentprovider.ImagesProvider" android:authorities="androidcontentproviderdemo.androidcontentprovider.images">
</provider>
</application>
</manifest>
Using the content provider
public class MainActivity extends Activity {
private static final String PROVIDER_NAME = "androidcontentproviderdemo.androidcontentprovider.images";
private static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/images");
private ListView listView;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lstViewImages);
adapter = new SimpleCursorAdapter(getBaseContext(),
R.layout.list_layout,
null,
new String[] { "IMAGETITLE", "IMAGEURL", "IMAGEDESC"},
new int[] { R.id.imgTitle , R.id.imgUrl, R.id.imgDesc }, 0);
listView.setAdapter(adapter);
refreshValuesFromContentProvider();
}
private void refreshValuesFromContentProvider() {
CursorLoader cursorLoader = new CursorLoader(getBaseContext(), CONTENT_URI,
null, null, null, null);
Cursor c = cursorLoader.loadInBackground();
adapter.swapCursor(c);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void onClickAddImage(View view) {
ContentValues contentValues = new ContentValues();
contentValues.put("IMAGETITLE", ((EditText) findViewById(R.id.edtTxtImageTitle)).getText().toString());
contentValues.put("IMAGEURL" , ((EditText)findViewById(R.id.edtImageUrl)).getText().toString());
contentValues.put("IMAGEDESC", ((EditText) findViewById(R.id.edtImageDesc)).getText().toString());
Uri uri = getContentResolver().insert(CONTENT_URI, contentValues);
Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show();
refreshValuesFromContentProvider();
}
}