마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

원하는 프로그램들만 모은 intent

0 추천
안념하세요.

Intent 관련 질문이 있어서 글을 쓰게되었습니다.

밑에와 같이 데이터 타입과 Mime형식을 맞춰서 인텐트를 사용하였습니다.

Intent intent = new Intent(Intent.ACTION_SEND);

intent.setDataAndType(path, "application/pdf");

startActivity(intent);

하지만 pdf확장에 관련된 app만 뜨게 되는데. 제가 깔고있는 app들중에 pdf열수 있는 어플들이 다 보입니다.

 

저는 만약에 이메일만 인텐트로 팝업을 띄우고 싶은데 어떻게 해야할지 모르겠습니다. Mime 타입 종류별로 다 넣어 봤는데도 분류를 하지 못하였는데요.

즉, 프린트관련 어플 인텐트, 이메일관련 어플 인텐트 이렇게 분류하여 팝업창을 띄우고 싶습니다.

고수님들의 조언을 듣고 싶습니다.
slee2540 (470 포인트) 님이 2014년 7월 3일 질문

1개의 답변

+1 추천
 
채택된 답변
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("message/rfc822");
startActivity(intent);
 
이메일 관련앱들은 저런 액션들을 무조건 가지고있습니다..
 
물론 개발자가 설정하기 나름이지만 저렇게해야 액션을 타서 실행이가능하거든요~
 
프린트앱는 잘모르겠네요... 프린트앱관련해서 apktool이란 툴사용해서 디컴파일해보면
 
어떤액션으로 처리되어있는지 알수있을거같은데요~
whdrb19 (23,520 포인트) 님이 2014년 7월 3일 답변
slee2540님이 2014년 7월 3일 채택됨
위에 소스와 같이 하니 이메일관련 어플은 잘나왔습니다. Mime type으로만은 따로 분류할수 없는건가요? 아직 안드로이드 초보라 stackoverflow에서 뒤져 봐도 email관련 글들은 많은데 print관련해서는 없네요.
private void initShareIntent(String type) {
        boolean found = false;
        Intent share = new Intent(android.content.Intent.ACTION_SEND);
        share.setType("application/*");

        // gets the list of intents that can be loaded.
        List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
        if (!resInfo.isEmpty()){
            for (ResolveInfo info : resInfo) {
                if (info.activityInfo.packageName.toLowerCase().contains(type) ||
                        info.activityInfo.name.toLowerCase().contains(type) ) {
                    //share.putExtra(Intent.EXTRA_SUBJECT,  "subject");
                    //share.putExtra(Intent.EXTRA_TEXT,     "your text");
                    //share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(myPath)) ); // Optional, just if you wanna share an image.
                    share.setPackage(info.activityInfo.packageName);
                    found = true;
                    break;
                }
            }
            if (!found)
                return;

            startActivity(Intent.createChooser(share, "Select"));
        }
    }
위에 소스를 가지고 print관련 어플을 바로실행하긴 했지만 제가 원하는 방식은 아닌것 같습니다.
프린트앱만 딱골라서 하기가 애매할것같습니다

삼성 프린트 앱 매니페스트파일에서 가져온겁니다.

<activity android:label="@string/request_print" android:name=".extrarequest.RequestReceiverDocumentForPrint">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/msword" />
                <data android:mimeType="application/vnd.ms-excel" />
                <data android:mimeType="application/vnd.ms-powerpoint" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
                <data android:mimeType="application/pdf" />
                <data android:mimeType="application/haansofthwp" />
                <data android:mimeType="application/x-hwp" />
                <data android:mimeType="application/hwp" />
            </intent-filter>
        </activity>
        <activity android:label="@string/request_fax" android:name=".extrarequest.RequestReceiverDocumentForFax">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/msword" />
                <data android:mimeType="application/vnd.ms-excel" />
                <data android:mimeType="application/vnd.ms-powerpoint" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
                <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
                <data android:mimeType="application/pdf" />
                <data android:mimeType="application/haansofthwp" />
                <data android:mimeType="application/x-hwp" />
                <data android:mimeType="application/hwp" />
            </intent-filter>
        </activity>
        <activity android:label="@string/request_print" android:name=".extrarequest.RequestReceiverPlainTextForPrint">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <data android:mimeType="text/plain" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:label="@string/request_fax" android:name=".extrarequest.RequestReceiverPlainTextForFax">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <data android:mimeType="text/plain" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

보시다시피 프린터를 구분할수있는 액션이 없습니다.
잠시만요~잠시만요~잠시만요~
org.androidprinting.intent.ACTION_GET_PRINT_SERVICE
com.sec.intent.action.PRINT_SERVICE
android.printservice.PrintService

종류가좀 많아서 뭘해야될지 잘모르겠네요 ㅎㅎ

Intent actionintent = new Intent("android.printservice.PrintService");
                List<ResolveInfo> list = getPackageManager().queryIntentServices(actionintent, 0);
                Log.v("test", "list = " + list.size());
                for (ResolveInfo resolveInfo : list) {
                    Log.v("test", "resolveInfo.activityInfo.toString = " + resolveInfo.serviceInfo.packageName);
                }
제가 생각하지 못했던 방법을 알려주셔서 감사합니다.
좋은하루 되세요.^^
어떻게든 해결해보겠습니다.
...