Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

안드로이드 앱 만들기 : 특정 앱으로 파일 공유 하기

Billcorea 2022. 3. 16. 22:25
반응형

이전에 posting 했던 pdf 공유 하기이 다음 이야기 정도가 될 것 같다.  요 몇일은 앱 수리를 하느라.. 좀 

아무튼 이번에 작업하면서 찾아낸 것에 대해서 기억을 정리해 두어야 겠다. 

 

이번에 하게 된 일은 pdf 을 만들어서 공유를 하는 것인데, 방법이 2가지 정도는 되는 것 같다. 

 

첫번째는 이전 posting 에서 처럼 공유할 파일만 지정해서 ACTION_SEND 액션을 실행하는 방법이고, 이번에는 그것을 특정앱으로 한정해 보는 것이다. 

 

public void sharePdf(String sPackageName) {
    File pdfFile = new File(getCacheDir(), "/" + fileName + ".pdf");
    Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName()+".fileProvider", pdfFile);

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("application/pdf");
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    shareIntent.setPackage(sPackageName);
    if (getPackageList(sPackageName)) {
        shareIntent.setPackage(sPackageName);
        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "전달할 제목");
        shareIntent.putExtra(Intent.EXTRA_TEXT, "전달할 메시지 내용.");
        startActivity(Intent.createChooser(shareIntent, "알림TITLE"));
    } else {
        String url = "market://details?id=" + sPackageName;
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(i);
    }
}

public boolean getPackageList(String packageName) {
        boolean isExist = false;

        PackageManager pkgMgr = getPackageManager();
        List<ResolveInfo> mApps;
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        mApps = pkgMgr.queryIntentActivities(mainIntent, 0);

        try {
            for (int i = 0; i < mApps.size(); i++) {
                Log.e("PackageName=", "" + mApps.get(i).activityInfo.packageName);

                if(mApps.get(i).activityInfo.packageName.startsWith(packageName)){
                    isExist = true;
                    break;
                }
            }
        }
        catch (Exception e) {
            isExist = false;
        }
        return isExist;
    }

이렇게 함수를 만들어 놓으면 구현 가능한 부분이 쉬워진다. 보내고 싶은 앱의 패키지 이름만 알아낸다면 그 앱으로 내가 만든 파일 (예시에서는 pdf 가 있다고 가정했다.) 을 바로 전달을 하게 되는 것이다. 

 

// com.dho.mobilefax : skt 모바일 팩스
// com.google.android.gm : gmail
// com.google.android.apps.docs : google drive 문서저장
// com.samsung.android.messaging : 삼성 문자 메시지
// com.google.android.apps.messaging : 구글 기본 메시지
// net.daum.android.mail : 다음메일
// com.kakao.talk : 카카오톡
// com.sec.print.mobileprint : 삼성모바일 프린트
// epson.print : epson print

예을 들면 이런 package name 을 찾아서 위에서 기술한 함수에 호출을 넣어 주면 된다.   그리고 위 예시 소스에서 getPackageList 함수를 이용해서 해당 앱이 사용중인 폰에 설치 되어 있는 지 확인하고 없으면 앱을 설치하도록 유도 페이지로 이동시키면 되는 것이다. 

 

 

코드 예시

 

이렇게 코드를 구현해 보았다. 

반응형