Android: могу ли я использовать это намерение из стороннего приложения?
Я использую намерение отправить сообщение через клиент 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 ответа
Вот решение опубликовано.
Я использую 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/can-i-use-this-intent.html
Недурно, если вы найдете это полезным!
Я рекомендую использовать PackageManager
а также queryIntentActivities()
определить, есть ли что-то, что будет обрабатывать ваши startActivity()
запрос.