Android: могу ли я использовать это намерение из стороннего приложения? - PullRequest
4 голосов
/ 02 декабря 2010

Я использую намерение отправить сообщение через клиент Twitter.Когда на телефоне нет приложения Twitter, я хочу перенаправить пользователя на рынок.Но исключение ActivityNotFoundException не работает.Каждый раз (когда у меня нет приложения Twitter) я получаю сообщение об ошибке «Ни одно приложение не может выполнить это действие»

Intent intentTwitter = new Intent(Intent.ACTION_SEND);
intentTwitter.putExtra(Intent.EXTRA_TEXT,msg);
intentTwitter.setType("application/twitter");

try{
 startActivity(Intent.createChooser(intentTwitter,"tweet"));
}catch(ActivityNotFoundException e){
 // lead to the app market
}

Я читаю ActivityNotFoundException - это обработчик исключений для startActivity и его потомка.Возможно, решение не в обработке исключений.

Ответы [ 2 ]

4 голосов
/ 03 декабря 2010

Вот опубликованное решение.

Я использую PackageManager и queryIntentActivities (), чтобы указать, может ли указанное действие использоваться в качестве намерения. Метод запрашивает у менеджера пакетов установленные на телефоне пакеты, которые могут ответить на намерение указанным действием. Если пакеты не найдены, метод возвращает false.

public static boolean isIntentAvailable(Context context, String action) {
        final PackageManager packageManager = context.getPackageManager();
        final Intent intent = new Intent(action);
        List<ResolveInfo> list =
                packageManager.queryIntentActivities(intent,
                        PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    }

Вот полный код. Я подключаюсь к Twitter с помощью клиента Twitter. Поэтому я использую

public void ConnectTwitter(){
    String msg = getResources().getString(R.string.partager_twitter).toString();
    Intent intentTwitter = new Intent(Intent.ACTION_SEND);
    intentTwitter.putExtra(Intent.EXTRA_TEXT,msg);
    intentTwitter.setType("application/twitter");
    if (isIntentAvailable(this,"application/twitter")){
        startActivity(Intent.createChooser(intentTwitter,getResources().getString(R.string.partager_sel_tweet)));
    }
    else{
        /* Handle Exception if no suitable apps installed */  
        Log.d("twitter", "Catch exception");
        new AlertDialog.Builder(PartagerActivity.this)  
       .setTitle(getResources().getString(R.string.partager_sel_tweet))  
       .setMessage(getResources().getString(R.string.partager_app_download))
       .setNegativeButton("Non", null)  
       .setPositiveButton("Oui", new DialogInterface.OnClickListener() {  
                     public void onClick(DialogInterface dialog, int whichButton) {  
                        intentMarket("market://search?q=twitter");  
                     }  
                 })  
       .show();     
    }

}

с методом intentMarket. Просто введите url = "market: // search? Q = twitter" Кстати в маркете не установлен эмулятор.

public void intentMarket (String url){
    Intent i = new Intent(Intent.ACTION_VIEW);
    Uri u = Uri.parse(url);
    i.setData(u);
    try{
        startActivity(i);
    }
    catch(ActivityNotFoundException e){
        Toast.makeText(this, "Pas d'applications twitter trouvé.", Toast.LENGTH_SHORT).show();  
    }
}

Подробнее о PackageManager http://android -developers.blogspot.com / 2009/01 / может-я потребительной это-intent.html

Недурно, если вы найдете это полезным!

1 голос
/ 02 декабря 2010

Я рекомендую использовать PackageManager и queryIntentActivities(), чтобы определить, есть ли что-то, что обработает ваш запрос startActivity().

...