رفتن به مطلب
  • 0

انتخاب یک مخاطب از لیست مخاطبین از طریق intent (بدون دسترسی به مخاطبین)


fun_code

سوال

سلام

بنده یک اپلیکیشن رو میخوام در کافه بازار منتشر کنم.

در این اپلیکیشن به کاربر این امکان رو میدم که از لیست مخاطبین یکی رو انتخاب کنه تا نام و شماره همراهش در اپلیکیشن نمایش داده بشه و ساده تر مشتری خودش رو ثبت کنه.

این کار رو از طریق کلاس ContactsUtils انجام دادم که در سایت رسمی B4X منتشر شده. اما دسترسی خواندن از مخاطبین رو لازم داره. لینک سورس :

https://www.b4x.com/android/forum/threads/using-startactivityforresult-with-javaobject.40374/post-244377

ناظر کافه بازار اپلیکیشن رو رد کرده و درخواست کرده حالا که با intent اینکار رو انجام میدم دیگه دسترسی خواندن از مخاطبین رو از منیفست پاک کنم و از کاربر این دسترسی رو نگیرم. لینکی هم برای انجام اینکار فرستاده که راهنماست.

https://developers.cafebazaar.ir/fa/app-publish-guidelines/academy/android-access-guide#Recover-saved-contacts

اما در B4A نمیدونم چطور انجامش بدم.

ممنون میشم راهنماییم کنید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

8 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

۱۴ ساعت قبل، fun_code گفته است:

کل سورس ارسالی بازار اینه :

ابتدا از "Intent" برای نمایش لیست مخاطبین ذخیره شده استفاده خواهیم کرد

"reqCode" هر مقدار دلخواه با تایپ "int" است که جهت ایجاد وجه تمایز بین نتیجه‌های برگشتی استفاده می‌شود.

پس‌از انتخاب مخاطب توسط کاربر، نتیجه به روش "onActivityResult" برمی‌گردد.

به منظور خواندن شماره همراه و نام مخاطب انتخاب شده توسط کاربر به صورت زیر عمل کنید.

 

متد زیررو به اکتیویتی اضافه کنید.

 

#If java
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;

 public String[] getContact(Intent intent) {
    Uri contactData = intent.getData();
    Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
    if (cursor.moveToFirst()) {
        String name = cursor.getString(cursor.getColumnIndexOrThrow("display_name_alt"));
        String number = cursor.getString(cursor.getColumnIndexOrThrow("data1"));
        String[] contact=new String[]{name,number};
		return contact;
    }
	return null;
}
#End If

همینظور متد ion_Event رو هم به صورت زیر ویرایش کنید.

Sub ion_Event (MethodName As String, Args() As Object)
	If -1=Args(0) Then
		Dim i As Intent=Args(1)
		Dim jo As JavaObject
		Dim contact() As String=jo.InitializeContext.RunMethod("getContact",Array(i))
		If contact<>Null Then
			Dim name As String=contact(0)
			Dim number As String=contact(1)
			Log("name="&name&" numebr="&number)
		End If
	End If
End Sub

حالا به شکل زیر اینتنت رو صدا بزنید

Dim i As Intent
i.Initialize(i.ACTION_PICK, "")
i.SetType("vnd.android.cursor.dir/phone_v2")
StartActivityForResult(i)

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام و درود. به شکل زیر عمل کنید. اول متدهای زیر رو اضافه کنید.

Sub StartActivityForResult(i As Intent)
    Dim jo As JavaObject = GetBA
    dim ion As JavaObject = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
    jo.RunMethod("startActivityForResult", Array As Object(ion, i))
End Sub

Sub GetBA As Object
    Dim jo As JavaObject
    Dim cls As String = Me
    cls = cls.SubString("class ".Length)
    jo.InitializeStatic(cls)
    Return jo.GetField("processBA")
End Sub
Sub ion_Event (MethodName As String, Args() As Object) As Object
    'Args(0) is resultCode: -1 is ok
    'Args(1) is the returning intent / result data
    If -1=Args(0) Then
        Dim i As Intent=Args(1)
        Log(i.ExtrasToString) ' this is the results
    End If
    Return Null
End Sub

حالا به شکل زیر برید به لیست مخاطبین

Dim i As Intent
  i.Initialize(i.ACTION_PICK, "content://com.android.contacts/contacts")
StartActivityForResult(i)

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

11 ساعت قبل، محمدرضا شاهپیری گفته است:

سلام و درود. به شکل زیر عمل کنید. اول متدهای زیر رو اضافه کنید.

Sub StartActivityForResult(i As Intent)
    Dim jo As JavaObject = GetBA
    dim ion As JavaObject = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
    jo.RunMethod("startActivityForResult", Array As Object(ion, i))
End Sub

Sub GetBA As Object
    Dim jo As JavaObject
    Dim cls As String = Me
    cls = cls.SubString("class ".Length)
    jo.InitializeStatic(cls)
    Return jo.GetField("processBA")
End Sub
Sub ion_Event (MethodName As String, Args() As Object) As Object
    'Args(0) is resultCode: -1 is ok
    'Args(1) is the returning intent / result data
    If -1=Args(0) Then
        Dim i As Intent=Args(1)
        Log(i.ExtrasToString) ' this is the results
    End If
    Return Null
End Sub

حالا به شکل زیر برید به لیست مخاطبین

Dim i As Intent
  i.Initialize(i.ACTION_PICK, "content://com.android.contacts/contacts")
StartActivityForResult(i)

 

سلام استاد

ممنون از راهنماییتون

اما خروجی لاگ برابر با no extras هست یعنی جواب نمیده.

و خروجی هم بده ، احتمالا ID مخاطب انتخاب شده است و بعد باید با همون دستورات کوئری و با متغیرهای ContentResolver و Uri و Cursor ، مخاطب رو با ID انتخاب شده استخراج کنیم که دسترسی لازم داره.

جالبه لینک سورس B4A که در پست اول فرستادم 90 درصد شبیه همون سورسی هست که در لینک راهنمای کافه بازاره. اما سورس B4A دسترسی به مخاطبین لازم داره ولی سورس مثال کافه بازار گویا دسترسی نمیخواد!

لینک ارسال
به اشتراک گذاری در سایت های دیگر

۷ ساعت قبل، fun_code گفته است:

سلام استاد

ممنون از راهنماییتون

اما خروجی لاگ برابر با no extras هست یعنی جواب نمیده.

و خروجی هم بده ، احتمالا ID مخاطب انتخاب شده است و بعد باید با همون دستورات کوئری و با متغیرهای ContentResolver و Uri و Cursor ، مخاطب رو با ID انتخاب شده استخراج کنیم که دسترسی لازم داره.

جالبه لینک سورس B4A که در پست اول فرستادم 90 درصد شبیه همون سورسی هست که در لینک راهنمای کافه بازاره. اما سورس B4A دسترسی به مخاطبین لازم داره ولی سورس مثال کافه بازار گویا دسترسی نمیخواد!

شما باید data رو بگیرین نه extra با جاوا آبجکت میتونید این کارو انجام بدید

لینک ارسال
به اشتراک گذاری در سایت های دیگر

7 ساعت قبل، محمدرضا شاهپیری گفته است:

شما باید data رو بگیرین نه extra با جاوا آبجکت میتونید این کارو انجام بدید

سلام استاد

والا در این زمینه اطلاعی ندارم و بلد نیستم.

لذا بنده عینا کد ارسالی شما رو اجرا کردم و خروجیش اون بود.

یه بار دیتا رو گرفتم انگار بصورت کد شده بود و احتمالا برای همین از Uri , ContentResolver استفاده میشه. نمیدونم...

برای همین عرض میکنم که گویا در بیسیک نیاز به دسترسی داره...

چون کتابخانه ها به نوعی هستن که دقیقا مشابه کتابخانه های جاوا نیست و چند کار رو باهم انجام میدن و دسترسی اضافه میخواد.

البته شک دارم که سورس کافه بازار هم که لینکش رو فرستادم دسترسی نخواد !

چون اگر اشتباه نکنم ، استفاده از متغیر Uri دسترسی لازم داره و در سورس ارسالی کافه بازار هم ازش استفاده شده...

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کل سورس ارسالی بازار اینه :

ابتدا از "Intent" برای نمایش لیست مخاطبین ذخیره شده استفاده خواهیم کرد

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);  
startActivityForResult(intent, {reqCode});

"reqCode" هر مقدار دلخواه با تایپ "int" است که جهت ایجاد وجه تمایز بین نتیجه‌های برگشتی استفاده می‌شود.

پس‌از انتخاب مخاطب توسط کاربر، نتیجه به روش "onActivityResult" برمی‌گردد.

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data){
	super.onActivityResult(reqCode, resultCode, data);
}

به منظور خواندن شماره همراه و نام مخاطب انتخاب شده توسط کاربر به صورت زیر عمل کنید.

Uri contactUri = data.getData(); 
String[] projection = {
	ContactsContract.CommonDataKinds.Phone.NUMBER, 
	ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
    	ContactsContract.CommonDataKinds.Phone._ID
    }
Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null);
cursor.moveToNext();
Long id = cursor.getLong(cursor.getColumnIndex(projection[2]));
String name = cursor.getString(cursor.getColumnIndex(projection[1]));
String phoneNumber = cursor.getString(cursor.getColumnIndex(projection[0]));
cursor.close();

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

25 دقیقه قبل، محمدرضا شاهپیری گفته است:

متد زیررو به اکتیویتی اضافه کنید.

 

#If java
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;

 public String[] getContact(Intent intent) {
    Uri contactData = intent.getData();
    Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
    if (cursor.moveToFirst()) {
        String name = cursor.getString(cursor.getColumnIndexOrThrow("display_name_alt"));
        String number = cursor.getString(cursor.getColumnIndexOrThrow("data1"));
        String[] contact=new String[]{name,number};
		return contact;
    }
	return null;
}
#End If

همینظور متد ion_Event رو هم به صورت زیر ویرایش کنید.

Sub ion_Event (MethodName As String, Args() As Object)
	If -1=Args(0) Then
		Dim i As Intent=Args(1)
		Dim jo As JavaObject
		Dim contact() As String=jo.InitializeContext.RunMethod("getContact",Array(i))
		If contact<>Null Then
			Dim name As String=contact(0)
			Dim number As String=contact(1)
			Log("name="&name&" numebr="&number)
		End If
	End If
End Sub

حالا به شکل زیر اینتنت رو صدا بزنید

Dim i As Intent
i.Initialize(i.ACTION_PICK, "")
i.SetType("vnd.android.cursor.dir/phone_v2")
StartActivityForResult(i)

 

سلام استاد

تست میکنم.

ممنونم

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

46 دقیقه قبل، محمدرضا شاهپیری گفته است:

متد زیررو به اکتیویتی اضافه کنید.

 

#If java
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;

 public String[] getContact(Intent intent) {
    Uri contactData = intent.getData();
    Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
    if (cursor.moveToFirst()) {
        String name = cursor.getString(cursor.getColumnIndexOrThrow("display_name_alt"));
        String number = cursor.getString(cursor.getColumnIndexOrThrow("data1"));
        String[] contact=new String[]{name,number};
		return contact;
    }
	return null;
}
#End If

همینظور متد ion_Event رو هم به صورت زیر ویرایش کنید.

Sub ion_Event (MethodName As String, Args() As Object)
	If -1=Args(0) Then
		Dim i As Intent=Args(1)
		Dim jo As JavaObject
		Dim contact() As String=jo.InitializeContext.RunMethod("getContact",Array(i))
		If contact<>Null Then
			Dim name As String=contact(0)
			Dim number As String=contact(1)
			Log("name="&name&" numebr="&number)
		End If
	End If
End Sub

حالا به شکل زیر اینتنت رو صدا بزنید

Dim i As Intent
i.Initialize(i.ACTION_PICK, "")
i.SetType("vnd.android.cursor.dir/phone_v2")
StartActivityForResult(i)

 

سلام مجدد

درست عمل کرد.

اما کامل نیست مثلا اگر یه مخاطب دوتا شماره داشته باشه فقط شماره آخر رو نمایش میده.

اما بسیار بسیار ممنون استاد. کارم رو راه انداخت.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...