Contacts photo is not displayed in Android? - java

Hi
I have a problem in displaying the contacts image in android.
Following is the code snippet I have used,
public String getCallersInfo(ContentResolver cnt,String phoneNumber)
{
mContentResolver = cnt;
lNumber = phoneNumber;
System.out.println("Start test");
Cursor l_Cur = mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER +" = ?",
new String[]{lNumber }, null);
while (l_Cur.moveToNext())
{
cid = l_Cur.getString(l_Cur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
}
System.out.println("The contact ID for person with phone number "+ lNumber + " is " + cid);
if(!(cid.equals("Unknown")))
{
Cursor cursor_contacts = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI,
null,
ContactsContract.Contacts._ID + " = ?",
new String[]{cid },
null);
while(cursor_contacts.moveToNext())
{
displayname = cursor_contacts.getString(cursor_contacts.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
photoid = cursor_contacts.getString(cursor_contacts.getColumnIndex(
ContactsContract.Contacts.PHOTO_ID));
}
System.out.println("The display name & photo id for person with phone number "
+ lNumber + " is " + displayname + " & " + photoid);
Uri contactPhotoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Integer.parseInt(cid));
// Uri photoUri = Uri.withAppendedPath(contactPhotoUri, Contacts.Photo.CONTENT_DIRECTORY);
// contactPhotoUri --> content://com.android.contacts/contacts/1557
InputStream photoDataStream = Contacts.openContactPhotoInputStream(mContentResolver,contactPhotoUri); // <-- always null
if(photoDataStream == null)
{
System.out.println("No photo available ");
}
Bitmap bt = BitmapFactory.decodeStream(photoDataStream);
setmPhoto(bt);
}
return displayname;
}
Thanks in advance.

for the display image contact according to me u just do that i saw..
copy ur .png images res/drawable/a_1;
and write this where u want to see this image..
View v1=findViewById(R.drawable.a_1);

Related

MediaStore.Audio and ContentResolver.query not getting music

I have a Music player project in Android Studio, and I need to get all music from the device.
But somehow this.getContentResolver().query(); is not getting any music from my device.
In the logcat there is no log, and if I debug the app before the while loop and after it(because it does not enter in the while loop) it says that the cursor does not have any row(mCount = 0)
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver = this.getContentResolver();
String[] projection = {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST
};
String where = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor c = resolver.query(uri, projection, where, null, null);
if (c != null) {
while (c.moveToNext()) {
String path = c.getString(0);
String name = c.getString(1);
String album = c.getString(2);
String artist = c.getString(3);
Log.e("Name :" + name, " Album :" + album);
Log.e("Path :" + path, " Artist :" + artist);
}
c.close();
}

android.database.sqlite.SQLiteException: no such column: bucket_display_name

I was trying to get buckets having audio files using MediaStore. This is working fine on Android 10 API 29 but not working previous Android versions. I've attached a screenshot of working example on Android 10 API 29.
Caused by: android.database.sqlite.SQLiteException: no such column:
bucket_display_name (code 1 SQLITE_ERROR): , while compiling: SELECT
bucket_display_name, bucket_id FROM audio ORDER BY date_added ASC
logcat.
Caused by: android.database.sqlite.SQLiteException: no such column: bucket_display_name (code 1 SQLITE_ERROR): , while compiling: SELECT bucket_display_name, bucket_id FROM audio ORDER BY date_added ASC
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:179)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
at android.content.ContentResolver.query(ContentResolver.java:802)
at android.content.ContentResolver.query(ContentResolver.java:752)
at android.content.ContentResolver.query(ContentResolver.java:710)
at com.aisar.mediaplayer.fragments.AudioFolderFragment$AsyncVideoFolderLoader.doInBackground(AudioFolderFragment.java:148)
at com.aisar.mediaplayer.fragments.AudioFolderFragment$AsyncVideoFolderLoader.doInBackground(AudioFolderFragment.java:130)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
at java.lang.Thread.run(Thread.java:764) 
Code:
class AsyncVideoFolderLoader extends AsyncTask<String, String, List<ModelAudioFolder>> {
private String sortBy;
public AsyncVideoFolderLoader(String sortBy) {
this.sortBy = sortBy;
}
#Override
protected List<ModelAudioFolder> doInBackground(String... strings) {
List<ModelAudioFolder> videoItems = new ArrayList<>();
videoItems.clear();
final HashMap<String, ModelAudioFolder> output = new HashMap<>();
final Uri contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] projection = {MediaStore.Audio.Media.BUCKET_DISPLAY_NAME, MediaStore.Audio.Media.BUCKET_ID};
try (final Cursor cursor = getActivity().getContentResolver().query(
contentUri,
projection,
null,
null,
"" + sortBy)) {
if ((cursor != null) && (cursor.moveToFirst())) {
final int columnBucketName = cursor.getColumnIndex(MediaStore.Audio.Media.BUCKET_DISPLAY_NAME);
final int columnBucketId = cursor.getColumnIndex(MediaStore.Audio.Media.BUCKET_ID);
do {
final String bucketName = cursor.getString(columnBucketName);
final String bucketId = cursor.getString(columnBucketId);
if (!output.containsKey(bucketId)) {
final int count = getCount(contentUri, bucketId);
final ModelAudioFolder item = new ModelAudioFolder(
"" + bucketId,
"" + bucketName,
"",
"" + getPath(bucketId),
"" + count
);
output.put(bucketId, item);
videoItems.add(item);
}
} while (cursor.moveToNext());
}
}
return videoItems;
}
private int getCount(#NonNull final Uri contentUri, #NonNull final String bucketId) {
try (final Cursor cursor = getActivity().getContentResolver().query(contentUri,
null, MediaStore.Audio.Media.BUCKET_ID + "=?", new String[]{bucketId}, null)) {
return ((cursor == null) || (cursor.moveToFirst() == false)) ? 0 : cursor.getCount();
}
}
private String getPath(String BUCKET_ID) {
String path = "";
String selection = null;
String[] projection = {
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.BUCKET_ID
};
Cursor cursor = getActivity().getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
null);
while (cursor.moveToNext()) {
if (BUCKET_ID.equals(cursor.getString(1))) {
//add only those videos that are in selected/chosen folder
path = cursor.getString(0);
}
}
return path;
}
#Override
protected void onPostExecute(List<ModelAudioFolder> audioFolderList) {
super.onPostExecute(audioFolderList);
if (audioFolderList.size() <= 0) {
noFoldersRl.setVisibility(View.VISIBLE);
foldersRl.setVisibility(View.GONE);
} else {
noFoldersRl.setVisibility(View.GONE);
foldersRl.setVisibility(View.VISIBLE);
}
Log.d("FoldersSize", "onPostExecute: " + audioFolderList.size());
adapterAudioFolder = new AdapterAudioFolder(getActivity(), audioFolderList, dashboardActivity);
foldersRv.setAdapter(adapterAudioFolder);
}
}
...
The reason of the exception is BUCKET_DISPLAY_NAME. It is added in API 29. Before this we were using DISPLAY_NAME for API 28 & below. Please refer to the docs BUCKET_DISPLAY_NAME.
For solution you can write conditions according to current API level. And for getting folder name, you can use RELATIVE_PATH.
In API verions <= 28 BUCKET_DISPLAY_NAME only exists for images and videos, so, accesible via MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME or MediaStore.Vidos.VideoColumns.BUCKET_DISPLAY_NAME.
That said, the solution to get the BUCKET_DISPLAY_NAME for audios in versions bellow 29, is to parse the MediaStore.Files.FileColumns.DATA. This field is deprecated in 29, but still valid in previous versions.
The field contains the actual path + filename, and since a BUCKET_DISPLAY_NAME is in reality the actual parent folder name where a file is located, what you need to do is to remove the file name, and then get the sub-string starting at the last found backward-slash from the path.
I did it my self now. First retrieved all audio files, then separated audio URIs. From audio URIs, I've got Folder Names. I'm posting my solution here so maybe someone else can get benefit from it.
class AsyncVideoFolderLoader extends AsyncTask<String, String, List<ModelAudioFolder>> {
private Cursor cursor;
List<ModelAudioTe> audioList;
private String sortBy;
public AsyncVideoFolderLoader(String sortBy) {
this.sortBy = sortBy;
}
#Override
protected List<ModelAudioFolder> doInBackground(String... strings) {
String selection = null;
String[] projection;
projection = new String[]{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.ALBUM_ID
};
cursor = getActivity().getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
null);
audioList = new ArrayList<>();
ModelAudioTe modelAudio;
while (cursor.moveToNext()) {
modelAudio = new ModelAudioTe(
"" + cursor.getString(0),
"" + cursor.getString(1),
"" + cursor.getString(2),
"" + cursor.getString(3),
"" + cursor.getString(4),
"" + cursor.getString(5),
"" + cursor.getString(6),
"" + cursor.getString(7));
audioList.add(modelAudio);
}
//creating audio paths/uris list
ArrayList<String> pathsList = new ArrayList<>();
pathsList.clear();
for (int i = 0; i < audioList.size(); i++) {
String folderName = new File(audioList.get(i).getDATA()).getParentFile().getName();
String folderId = new File(audioList.get(i).getDATA()).getParentFile().getParent();
pathsList.add(folderId + "/" + folderName);
}
//generating folder names from audio paths/uris
List<ModelAudioFolder> folderList = new ArrayList<>();
folderList.clear();
for (int i = 0; i < audioList.size(); i++) {
String folderName = new File(audioList.get(i).getDATA()).getParentFile().getName();
String folderId = new File(audioList.get(i).getDATA()).getParentFile().getParent();
int count = Collections.frequency(pathsList, folderId + "/" + folderName);
String folderRoot;
String folderRoot1 = "";
if (audioList.get(i).getDATA().contains("emulated")) {
folderRoot = "emulated";
} else {
folderRoot = "storage";
}
if (i > 0) {
if (audioList.get(i - 1).getDATA().contains("emulated")) {
folderRoot1 = "emulated";
} else {
folderRoot1 = "storage";
}
}
if (i == 0) {
ModelAudioFolder model = new ModelAudioFolder("" + folderId + "/" + folderName, "" + folderName, "", "" + folderId + "/" + folderName, "" + count);
folderList.add(model);
Log.d("The_Tag1", "onCreate: " + folderName + " " + folderRoot + " " + folderId + "/" + folderName + " " + count);
} else if (
folderName.equals(new File(audioList.get(i - 1).getDATA()).getParentFile().getName())
&&
folderRoot.equals(folderRoot1)
) {
//exclude
} else {
ModelAudioFolder model = new ModelAudioFolder("" + folderId + "/" + folderName, "" + folderName, "", "" + folderId + "/" + folderName, "" + count);
folderList.add(model);
Log.d("The_Tag1", "onCreate: " + folderName + " " + folderRoot + " " + folderId + "/" + folderName + " " + " " + count);
}
}
return folderList;
}
#Override
protected void onPostExecute(List<ModelAudioFolder> audioFolderList) {
super.onPostExecute(audioFolderList);
Log.d("ModelAudioFolder_Size", "Count:" + audioFolderList.size());
try {
if (audioFolderList.size() <= 0) {
noFoldersRl.setVisibility(View.VISIBLE);
foldersRl.setVisibility(View.GONE);
} else {
noFoldersRl.setVisibility(View.GONE);
foldersRl.setVisibility(View.VISIBLE);
}
Log.d("FoldersSize", "onPostExecute: " + audioFolderList.size());
adapterAudioFolder = new AdapterAudioFolder(getActivity(), audioFolderList, dashboardActivity);
foldersRv.setAdapter(adapterAudioFolder);
} catch (Exception e) {
e.printStackTrace();
}
}
}

How get thumbnails from a specific directory with content provider

I have this code that want to extract all thumbnails but the array result is empty and logically list bitmaps too.Where path is "/emulated/storage/legacy", context is the Activity and the query is with condition. Any Idea? Thanks.
public void getThubmnails() {
String[] cols = {
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.MEDIA_TYPE,
MediaStore.Files.FileColumns.MIME_TYPE,
MediaStore.Files.FileColumns.DISPLAY_NAME
};
Uri uri = MediaStore.Files.getContentUri("external");
Cursor cursor = this.context.getContentResolver().query(
uri,
cols,
MediaStore.Files.FileColumns.DATA + "=?",
new String[] {
path,
},
null
);
cursor.moveToFirst();
int index = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);
int name = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DISPLAY_NAME);
int tipo = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE);
int path = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
String[] result = new String[cursor.getCount()];
while(cursor.moveToNext()) {
result[cursor.getPosition()] = "ID: " + String.valueOf(cursor.getLong(index))
+ " " + "NAME: " + cursor.getString(name)
+ " " + "MIME_TYPE: " + cursor.getString(tipo)
+ " " + "DATA: " + cursor.getString(path);
this.bitmap.add(MediaStore.Images.Thumbnails.getThumbnail(
this.context.getContentResolver(),
cursor.getLong(index),
MediaStore.Images.Thumbnails.MICRO_KIND, null));
}
}

How to check if id is exists in Android?

I want to check if id is exists in SQLIte DB then update that id , if id is not present in SQLite then insert that id. How can i do this. Can someone help how to work with.Thanks to Appreciate.
Here is my Activity code
public void saveResult()
{
AnswerOptions = (RadioButton) findViewById(Options_RadioGroup.getCheckedRadioButtonId());
String str_AnswerOptions = AnswerOptions.getText().toString().trim();
System.out.println("rbVal = " + str_AnswerOptions);
if (str_AnswerOptions.equals(((Datastructure) Vectore_mquestionDatabaseStructure .get(StaticClass.QuestionNumber)).Answer))
{
if (!StaticClass.isTest)
{
try
{
DatabaseHelper databaseHelper = new DatabaseHelper(this.getApplicationContext());
sqdb = databaseHelper.getWritableDatabase();
String strCountQuery = "SELECT question_id, question_type , question_no FROM question_answers where question_id = " + convertVector ;
Cursor cur = sqdb.rawQuery(strCountQuery , null);
if (cur.moveToFirst())
{
int iCount = cur.getCount();
System.out.println("iCount = " + iCount);
if(cur.getCount() <= 0 )
{
String strstrqueType = txtViewQuestiontype.getText().toString().trim();
String str_que = txtViewQuestion.getText().toString().trim();
String str_marks = "1";
databaseHelper.insertQueDetails(strQueLimit, strstrqueType, str_que, str_AnswerOptions, str_marks , strOption_Id);
System.out.println("strQueLimit = " + strQueLimit + ", strstrqueType = " + strstrqueType +" , str_que = " + str_que + " , str_AnswerOptions = " + str_AnswerOptions + ", str_marks = " + str_marks + ", strOption_Id = " + strOption_Id);
Toast.makeText(this, " Right Answer ", Toast.LENGTH_LONG).show();
}
else
{
cur.moveToFirst();
qid = cur.getInt(cur.getColumnIndex("question_id"));
String strQue_Type = cur.getString(cur.getColumnIndex("question_type"));
String strQue_Nomber = cur.getString(cur.getColumnIndex("question_no"));
System.out.println("qid in checkUpdateTable() = " + qid);
System.out.println("strQue_Type in checkUpdateTable() = " + strQue_Type);
System.out.println("strQue_Nomber in checkUpdateTable()= " + strQue_Nomber);
QueId = qid;
databaseHelper.updateAnswerRow(qid, str_AnswerOptions);
}
}
}
catch (SQLiteException se )
{
Log.e(getClass().getSimpleName(), "Could not create or Open the database");
}
finally
{ if (sqdb != null) { sqdb.close();} }
}
}
}
You need to set a constraint on the table to trigger a "conflict" which you then resolve by doing a replace:
CREATE TABLE data (id INTEGER PRIMARY KEY, question_id INTEGER, question_type TEXT, question_no TEXT);
CREATE UNIQUE INDEX data_idx ON data(question_id);
Then you can issue:
INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 2, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 5);

Retrieve HOME Contact Number from address book

currently i have a application which will retrieve all the contact
details and will display all the available Contact Names.But now i want to retrieve Home,work numbers.I search for this everywhere but i couldn't. how can
i achieve this? please help me.
Thanks.
I used this code to get Home Numbers.
Cursor c = getContentResolver().query(Data.CONTENT_URI,
new String[] {Data._ID, Phone.NUMBER, Data.MIMETYPE},
Data.RAW_CONTACT_ID + "=?" + " AND "
+ Data.MIMETYPE + "='" + Phone.TYPE_HOME + "'",
new String[] {String.valueOf(contactId)}, null);
But what i need is to get Home,Work,Mobile (with name,email address,etc) numbers using single query.
using this code it always returns me type=0
Cursor c = getContentResolver().query(Data.CONTENT_URI,
null,
Data.CONTACT_ID + "=?",
new String[] {String.valueOf(contactId)}, null);
while(c.moveToNext()){
int type = c.getInt(c.getColumnIndex(Phone.TYPE));
..
}
try this:
int type = mCursor.getInt(mCursor.getColumnIndex(Phone.TYPE));
the "type" value will be 1,2,3 or 4 where
TYPE_HOME = 1;
TYPE_MOBILE = 2;
TYPE_WORK = 3;
TYPE_OTHER = 7;
Ok finally i completed the task.here my code
String mobile = "";
String home="";
String work="";
String fax="";
String other="";
String disName="";
String pName="";
String fName="";
String lName="";
String sName="";
String mName="";
String postBox="";
String streat="";
String country="";
String emailAdd="";
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null, null, null);
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
disName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
///*
Cursor phones = cr.query(Phone.CONTENT_URI, null,
Phone.CONTACT_ID + " = " + id, null, null);
while (phones.moveToNext()) {
String number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
System.out.println("Numeber= "+number);
switch (type) {
case Phone.TYPE_HOME:
home=number;
break;
case Phone.TYPE_MOBILE:
mobile=number;
break;
case Phone.TYPE_WORK:
work=number;
break;
case Phone.TYPE_OTHER:
other=number;
break;
case Phone.TYPE_FAX_HOME:
fax=number;
break;
case Phone.TYPE_FAX_WORK:
fax=number;
break;
}
}
phones.close();
Cursor name = cr.query(Data.CONTENT_URI, null,
Data.CONTACT_ID + " ="+id +" AND "+Data.MIMETYPE+"='"+StructuredName.CONTENT_ITEM_TYPE+"'", null, null);
while(name.moveToNext()){
sName=name.getString(name.getColumnIndex(StructuredName.PREFIX));
fName=name.getString(name.getColumnIndex(StructuredName.GIVEN_NAME));
mName=name.getString(name.getColumnIndex(StructuredName.MIDDLE_NAME));
lName=name.getString(name.getColumnIndex(StructuredName.FAMILY_NAME));
sName=name.getString(name.getColumnIndex(StructuredName.SUFFIX));
System.out.println(mName);
}
Cursor address = cr.query(Data.CONTENT_URI, null,
Data.CONTACT_ID + " ="+id +" AND "+Data.MIMETYPE+"='"+StructuredPostal.CONTENT_ITEM_TYPE+"'", null, null);
while(address.moveToNext()){
postBox=address.getString(address.getColumnIndex(StructuredPostal.POBOX));
streat=address.getString(address.getColumnIndex(StructuredPostal.STREET));
mName=address.getString(address.getColumnIndex(StructuredPostal.COUNTRY));
System.out.println(postBox);
}
Cursor email = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
Data.CONTACT_ID + " ="+id , null, null);
while(email.moveToNext()){
emailAdd=email.getString(email.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
}
In where clause of your query use Phone.TYPE_HOME.. this will give you the desired nor..

Categories

Resources