سبد (0)

اجرای برنامه ی بومی با اینتنت ها

اجرای برنامه های بومی با اینتنت ها

یکی از جنبه های برنامه نویسی اندروید استفاده از اینتنت ها برای فراخوانی اکتیویتی های برنامه های دیگر است.شما می توانید اکتیویتی هایی را که در برنامه های بومی یک دیوایس هستند را فراخوانی کنید.به عنوان مثال اگر در برنامه های خود نیاز دارید که یک صفحه وب را بارگذاری کنید,به جای اینکه خودتان یک مرورگر وب بنویسید.می توانید این کار را به وسیله ی شئ Intent انجام دهید.این شئ web browser بومی اندروید را در اختیار شما قرار می دهد.در ادامه به شما نشان می دهیم که چگونه برنامه های بومی دستگاه اندروید را فراخوانی کنید:

1.در ایکلیپس یک پروژه ی جدید با نام  Intents بسازید.

2.فایل main.xml رو به صورت زیر ویرایش کنید:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.PRG.intents.MainActivity" >

<Button
android:id="@+id/btn_webbrowser"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Web Browser" />

<Button
    android:id="@+id/btn_chooseContact"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="132dp"
    android:text="Choose Contact”" />

<Button
    android:id="@+id/btn_showMap"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="67dp"
    android:text="Show Map" />

<Button
    android:id="@+id/btn_makecalls"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/btn_chooseContact"
    android:layout_centerVertical="true"
    android:text="Make Calls" />

</RelativeLayout>

3.فایل MainActivity.java را به صورت زیر ویرایش کنید:

 

package com.PRG.intents;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.net.Uri;
import android.provider.ContactsContract;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button b1, b2, b3, b4;

int request_Code = 1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//---Web browser button---
  b1 = (Button) findViewById(R.id.btn_webbrowser);
  b1.setOnClickListener(new OnClickListener(){

 public void onClick(View arg0){
 Intent i = new
  Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse("http://www.amazon.com"));
     startActivity(i);

         }

    });
 
//---Make calls button---
  b2 = (Button) findViewById(R.id.btn_makecalls);
  b2.setOnClickListener(new OnClickListener(){
         
 public void onClick(View arg0){
  Intent i = new
   Intent(android.content.Intent.ACTION_DIAL,
     Uri.parse("tel:+981234567890"));
        startActivity(i);
        }
   });
 
//---Show Map button---
  b3 = (Button) findViewById(R.id.btn_showMap);
  b3.setOnClickListener(new OnClickListener(){

  public void onClick(View arg0){
   Intent i = new
    Intent(android.content.Intent.ACTION_VIEW,
      Uri.parse("geo:37.827500,-122.481670"));
             startActivity(i);
        }
    });
//---Choose Contact button---
  b4 = (Button) findViewById(R.id.btn_chooseContact);
  b4.setOnClickListener(new OnClickListener(){

   public void onClick(View arg0){
      Intent i = new
        Intent(android.content.Intent.ACTION_PICK);
        i.setType(ContactsContract.Contacts.CONTENT_TYPE);
          startActivityForResult(i,request_Code);
            }
      });
  }
 public void onActivityResult(int requestCode, int resultCode, Intent data){
   
   if (requestCode == request_Code)
    {
   if (resultCode == RESULT_OK)
   {
    Toast.makeText(this,data.getData().toString(),
        Toast.LENGTH_SHORT).show();
        Intent i = new Intent(
        android.content.Intent.ACTION_VIEW,
        Uri.parse(data.getData().toString()));
        startActivity(i);
          }
        }
    }
}

4.برنامه را اجرا کنید.

5.روی دکمه ی Web Browser کلیک کنید تا مرورگر در شبیه ساز باز شود.

6.روی دکمه ی Make Calls و Phone کلیک کنید.

7.برای اجرای نقشه روی Map کلیک کنید.(برای اجرای Map باید AVD را اجرا کنید که از Google APIs پشتیبانی کند.)

روش کار

در این مثال ملاحظه فرمودید که چگونه می توان از شئ Intent برای استفاده از برنامه های بومی اندروید مثل نقشه,تلفن,مخاطبین,مرورگر,...بهره برد.در اندروید,اینتنت ها معمولاً به صورت جفت action و data به کار می روند.قسمت action توضیح می دهد که چه کاری قرار است صورت گیرد.مثلاً ویرایش یا نمایش محتوا یا ... و قسمت data مشخص می کند که هر آنچه را که تحت تأثیر قرار گرفته شده است.مانند یکی از مخاطبین در بانک اطلاعاتی مخاطب ها.data به صورت یک شئ Uri تعریف شده است.

چند نمونه از action ها به این صورت هستند:

  •  ACTION_VIEW
  • ACTION_DIAL
  • ACTION_PICK

چند نمونه از DATA ها به این صورت هستند:

  • www.google.com
  • tel:+981234567890
  • geo:37.827500,-122.481670
  • content://contacts

در کل هر دو بخش data و action عملیاتی را که باید انجام گیرد مشخص می کنند.به عنوان مثال برای برقراری تماس تلفنی باید دو عبارت ACTION_DIAL/tel:+981234567890 را با هم بکار برد.برای نمایش لیستی از مخاطبین گوشی دو عبارت ACTION_PICK/content://contacts را باهم بکار برد.

در دکمه ی اول یک شئ Intent ایجاد شده است که دو آرگومان را به سازنده ی خود ارسال می کند.این دو آرگومان data و action هستند:


Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
startActivity(i);

در اینجا action به وسیله ی ثابت android.content.Intent.ACTION_VIEW نشان داده شده است.از متد ()parse کلاس Uri برای تبدیل یک رشته ی URL به شئ Uri استفاده می کنیم.

ثابت android.content.Intent.ACTION_VIEW در وافع اشاره دارد به اکشن android.intent.action.VIEW

بنابراین کد بالا را می توان به شکل زیر نوشت:

 

Intent i = new
Intent(“android.intent.action.VIEW”,
Uri.parse(“http://www.amazon.com”));
startActivity(i);

و به این صورت هم می توان نوشت:

 

Intent i = new
Intent(“android.intent.action.VIEW”);
i.setData(Uri.parse(“http://www.amazon.com”));
startActivity(i);

از متد ()setData برای ارسال data به صورت جداگانه استفاده می کنیم.

برای دکمه ی دوم,یک شماره را شماره گیری می کنیم.برای این کار شماره تلفن را در بخش data ارسال می کنیم:

 

Intent i = new
Intent(android.content.Intent.ACTION_DIAL,
Uri.parse(“tel:+981234567890”));
startActivity(i);

در این حالت قبل از شماره گیری شماره ی مورد نظر به کاربر نمایش داده می شود و تا وقتی که کاربر کلید call یا dial را فشار ندهد شماره گیری صورت نمی گیرد.اما اگر می خواهید بدون دخالت کاربر شماره ای گرفته شود از کد زیر استفاده کنید:

 

Intent(android.content.Intent.ACTION_CALL,
Uri.parse(“tel:+981234567890”));
startActivity(i);
  • اگر می خواهید که برنامه ی شما مستقیماً تماسی را با شماره ی بخصوصی برقرار کند,باید در قسمت permissions عبارت android.permission.CALL__PHONE را هم وارد کنید.

برای نمایش شماره بدون شماره گیر, بخش data را به صورت زیر در آورید:

 

Intent i = new
Intent(android.content.Intent.ACTION_DIAL);
startActivity(i);

دکمه ی سوم یک نقشه را با استفاده از ثابت ACTION_VIEW نمایش می دهد:

 

Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“geo:37.827500,-122.481670”));
startActivity(i);

در این قسمت بجای http از geo استفاده می کنیم.

دکمه ی چهارم شماره های برنامه را فراخوانی می کند و امکان انتخاب یک مخاطب را به کاربران می دهد.چون شما یک کاربری هستید که می خواهید یک مخاطب را انتخاب کنید,به برنامه ای نیاز دارید که مقداری را برگرداند.برای این کار به یک نوع data نیاز دارید که نشان دهد چه نوع داده هایی نیاز به مقدار بازگشتی دارند:

 

Intent i = new
Intent(android.content.Intent.ACTION_PICK);
i.setType(ContactsContract.Contacts.CONTENT_TYPE);
startActivityForResult(i,request_Code);

اگر شما میخواهید تنها مخاطبین و شماره تلفن را ببینید و انتخاب کنید,دستور زیر رابکار ببرید:

 

i.setType(
ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);

چون شما از برنامه نتیجه ای را انتظار دارید,متد ()startActivityForResult را فراخوانی کنید,و یک
request Code را به شئ Intent ارسال کنید.همچنین برای دریافت نتیجه ازین فعالیت نیاز دارید که متد ()onActivityResult را پیاده سازی کنید:

 

public void onActivityResult(int requestCode,
int resultCode, Intent data)
{
if (requestCode == request_Code)
{
if (resultCode == RESULT_OK)
{
Toast.makeText(this,data.getData().toString(),
Toast.LENGTH_SHORT).show();
Intent i = new Intent(
android.content.Intent.ACTION_VIEW,
Uri.parse(data.getData().toString()));
startActivity(i);
}
}
}

در مورد این برنامه,وقتی شما یک مخاطب خاصی را انتخاب می کنید(با استفاده از ثابت ACTION_PICK),یک URL حاوی مخاطب انتخاب شده به عنوان بازگشتی است,به صورت زیر:

 

content://com.android.contacts/contacts/loopup/0r1-1234567890/1

به دست آوردن این URL بدون این دلنش که, بدانید با آن چکار کنید برای شما مفید نیست.بنابراین در این مورد شما میتوانید یک شئ Intent دیگری به شکل زیر ایجاد کنید:

 

Intent object to view it:
Intent i = new Intent(
android.content.Intent.ACTION_VIEW,
Uri.parse(data.getData().toString()));
startActivity(i);

این کد جزئیات بیشتری را در مورد مخاطب انتخاب شده به شما می دهد.

افزودن دسته بندی(Category)

شما میتوانید با استفاده از عنصر <category> در اینتنت فیلتر,اکتیویتی خود را دسته بندی کنید.فرض می کنیم که عنصر <category> در فایل AndroidManifest.xml اضافه شده است:

 

Suppose you have added the following <category> element to the AndroidManifest.xml file:
<?xml version=”1.0” encoding=”utf-8”?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”net.learn2develop.Intents”
android:versionCode=”1”
android:versionName=”1.0”>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.MainActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<activity android:name=”.MyBrowserActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<action android:name=”net.learn2develop.MyBrowser” />
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”net.learn2develop.Apps” />
<data android:scheme=”http” />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion=”9” />
<uses-permission android:name=”android.permission.CALL_PHONE” />
<uses-permission android:name=”android.permission.INTERNET” />
</manifest>

در اینجا کد زیر مستقیماً اکتیویتی MyBrowserActivity را اجرا می کند.

 

Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
i.addCategory(“net.learn2develop.Apps”);
startActivity(i);

category را با استفاده از متد ()addCategory به Intent اضافه می کنید.اما حتی اگر عبارت()addCategory را حذف کنید,باز هم کد بالا اکتیویتی MyBroeserActivity را اجرا می کند.چون کماکان با android.intent.category.DEFAULT یا همان دسته ی پیشفرض مطابقت دارد.

البته اگر شما دسته بندی را تعریف کنید که با دسته بندی تعریف شده در اینتنت فیلتر مطابقت نداشته باشد,هیچ اکتیویتی ایجاد نمی گردد.

 

Intent i = new
Intent(“net.learn2develop.MyBrowser”,
Uri.parse(“http://www.amazon.com”));
//---this category does not match any in the intent-filter---
i.addCategory(“net.learn2develop.OtherApps”);
startActivity(i);

دسته بندی بالا (“net.learn2develop.OtherApps”) با هیچ یک از دسته بندی های تعریف شده در اینتنت فیلتر مطابقت ندارد.بنابراین خطای زمان اجرا یا run-time رخ خواهد داد.(اگر از متد ()createChoose کلاس Intent استفاده نکنید.)

اگر دسته بندی زیر را در فیلتر اینتنت MayBrowserActivity اضافه کنید,کد بالا کار خواهد کرد:

 

<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<action android:name=”net.learn2develop.MyBrowser” />
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”net.learn2develop.Apps” />
<category android:name=”net.learn2develop.OtherApps” />
<data android:scheme=”http” />
</intent-filter>

میتوانید چندین دسته بندی برای یک شئ Intent در نظر بگیرید.به عنوان مثال عبارات زیر دسته بندی “net.learn2develop.SomeOtherApps” را به شئ اینتنت اضافه کنید:

 

Intent i = new
Intent(“net.learn2develop.MyBrowser”,
Uri.parse(“http://www.amazon.com”));
i.addCategory(“net.learn2develop.OtherApps”);
i.addCategory(“net.learn2develop.SomeOtherApps”);
startActivity(i);

در جایی که اینتنت فیلتر کد “net.learn2develop.SomeOtherApps” را تعریف نکرده است,کد بالا کار نخواهد کرد و نمی تواند اکتیویتی MyBrowserActivity را اجرا کند.برای حل این مشکل باید دوباره دسته بندی “net.learn2develop.SomeOtherApps” را به اینتنت فیلتر اضافه کنید.

در این مثال کاملاً مشخص است که وقتی از یک شئ Intent با دسته بندی استفاده می کنید,همه ی دسته بندی های اضافه شده به شئ Intent باید با آنهایی که در اینتنت فیلتر قبلاً تعریف شده اند مطابقت داشته باشد تا اکتیویتی بتواند فراخوانی شود.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه