Android ShareCompat을 사용하여 공유할 때 이미지 전달 방법, 콜백 수신 방법

8432 단어 AndroidJava
이 일

메시지가 많은 것 같았는데 안 나올 줄 몰라서 필기를 했어요.

프로그램 라이브러리

  • com.android.support:support-compat:28.0.0
  • 실시


    SomeActivity.java
    // アクティビティ内から実行する前提のコード
    private void showShareChooser() {
        File tempFile = new File(getApplicationContext().getExternalCacheDir(), tempImgFilePath);
    
        // ファイルをシェアするためにURIを取得する場合は、FileProviderを通じて、後述するオーソリティの名前を指定して取得する必要がある
        Uri uri = FileProvider.getUriForFile(getApplicationContext()
                , getApplicationContext().getPackageName() + ".provider"
                , tempFile);
    
        ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this);
        builder.setChooserTitle(chooserTitle) // シェアする時のタイトル
                .setSubject(subject) // 件名。使われ方はシェアされた側のアプリによる
                .setText(text) // 本文。使われ方はシェアされた側のアプリによる
                .setStream(uri) // ファイルをシェアする時は、そのURIを指定
                .setType("image/jpeg"); // ストリームで指定したファイルのMIMEタイプ
    
        // URIに対する読み取り権限を付与する
        Intent intent = builder.createChooserIntent().addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
        // コールバックを受け取りたい場合は、そのインテントを使ってアクティビティを開始する
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, SNS_SHARE);
        }
    
        // 結果を受け取らなくても良い場合は、ビルダーからそのまま開始できる
        // builder.startChooser();
    }
    
    수신이 되돌아오는 경우 평상시onActivityResult대로 수신할 수 있다.
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case SNS_SHARE:
                // 戻りを受け取って何らか処理する
                // resultCode は必ずゼロになるので、 RESULT_OK で判定しない
                doSomething();
                break;
    
            default:
                super.onActivityResult(requestCode, resultCode, data);
                break;
        }
    }
    

    파일을 공유할 때


    이미지 등을 공유하는 경우 Bitmap을 직접 공유할 수 없기 때문에 파일에 잠시 저장해야 합니다.
    또한 다음과 같이 저장 목적지에서 읽을 수 있도록 허용해야 한다.
    먼저 XML로 경로를 지정합니다.
    src/main/res/xml/provider_paths.xml
    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-cache-path name="cache" path="." />
    </paths>
    
    external-cache-path 등은 보존 목적지에 따라 달라진다.
    영어지만 참조파일 프로파일러 공식 참조.
    그런 다음 AndroidManifest.xml 에서 공급업체를 지정합니다.
    AndroidManifest.xml
    <manifest
        package="com.example"
        xmlns:android="http://schemas.android.com/apk/res/android">
    :
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    :
        </application>
    :
    </manifest>
    

    참고 자료

  • FileProvider | Android Developers
  • Sharing Content between Android Apps – Android Developers – Medium
  • 좋은 웹페이지 즐겨찾기