=================================
=================================
=================================
출처: http://anditstory.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9CIntent-filter-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%ED%96%89%EA%B0%80%EB%8A%A5-app-%EB%AA%A9%EB%A1%9D-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0
의외로 모르는 사람이 많은 듯 싶어서 정리해둡니다.
기본적으로 인터넷에서 미디어 등을 선택하거나 단말기에 저장된 사진, 동영상 등을 실행 하였을 경우
어떤 app을 이용해서 해당 컨텐츠를 플레이(?)할 것인지 창으 뜨게 되는데 이는 다음과같은 방법으로 구현합니다.
먼저 알아볼 것이 동영상을 플레이 할 경우
보통
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("비디오 경로"),"video/*");
startactivity(intent);
위와 같은 방법으로 하게 되는데
실행가능한 app 목록을 조회하는 방법도 위의 Intent를 그대로 이용합니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
public class MainActivity extends Activity {
ArrayList<Hashtable<String, Object>> data;
String targetVideo = "비디오경로";
Intent playVideo;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TextView(this));
playVideo = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri
.parse(targetVideo);
playVideo.setDataAndType(uri, "video/*");
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(playVideo,
PackageManager.GET_META_DATA);
data = new ArrayList<Hashtable<String, Object>>();
for (ResolveInfo resolveInfo : list) {
try {
Hashtable<String, Object> tmp = new Hashtable<String, Object>();
tmp.put("activity", resolveInfo.activityInfo.name);
tmp.put("package", resolveInfo.activityInfo.packageName);
tmp.put("appname",
pm.getApplicationLabel(
resolveInfo.activityInfo.applicationInfo)
.toString());
tmp.put("res", resolveInfo.activityInfo.loadIcon(pm));
Log.i("LUR", tmp.toString());
data.add(tmp);
} catch (Exception e) {
// TODO: handle exception
}
}
AlertDialog.Builder alert = new Builder(this);
alert.setTitle("플레이어 선택");
ListView listView = new ListView(this);
alert.setView(listView);
alert.setNegativeButton("취소", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
final Dialog dial = alert.show();
listView.setAdapter(new runListAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
dial.dismiss();
//파라미터를 넘기는 방법입니다.
ComponentName cm = new ComponentName((String) data.get(arg2).get("package"), (String) data.get(arg2).get("activity"));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setComponent(cm);
intent.setDataAndType(Uri.parse(targetVideo), "video/*");
startActivity(intent);
}
});
}
class runListAdapter extends BaseAdapter implements ListAdapter{
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public String getPkgActivity(int position){
return (String) data.get(position).get("activity");
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View listItem = getLayoutInflater().inflate(R.layout.target_item, null);
ImageView img = (ImageView) listItem.findViewById(R.id.launchIcon);
TextView tx = (TextView) listItem.findViewById(R.id.launchLabel);
tx.setText((CharSequence) data.get(position).get("appname"));
img.setImageDrawable((Drawable) data.get(position).get("res"));
return listItem;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
|
좀 급하게 하느라 보기 힘든 면이 없진 않지만 중요한 부분은
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(playVideo, PackageManager.GET_META_DATA);
-> 사용할Intent로 실행 가능한 app목록을 조회해오는 부분입니다.
ComponentName cm = new ComponentName((String) data.get(arg2).get("package"), (String) data.get(arg2).get("activity"));
-> 데이터를 보낼때 필요한 부분이라고 합니다.
참고록 apiDemo 에서 보시면 맨 처음 activity목록을 조회해오는 부분이 위와 같은 방식으로 구현되어있으니 참고하시면 도움이 될듯합니다.
위의 목록을 받아오는 부분은 Intent.
createChooser 를 이용하시는것과 거의 동일합니다.
=================================
=================================
=================================
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
안드로이드 하이브리드 앱 관련 (0) | 2014.05.07 |
---|---|
안드로이드 개발 패키지정보를 가져와보자 (0) | 2014.04.24 |
android에서 zip 파일 압축 해제(unzip) (4) | 2014.04.18 |
android 안드로이드 개발 다운로드 관련 (0) | 2014.02.27 |
android webview apk download to sdcard from webview webview 를 통해 안드로이드 파일 다운로드, apk 다운로드 설치 관련 (0) | 2014.02.27 |