質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Android

    7302questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Androidアプリで画像をfacebook・Twitter・LINE・Instagramにシェアしたい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,108

yu01

score 9

お世話になっております。
質問させて頂きます。

実現したいことは、タイトルの通りです。

AndroidManifest.xml

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.app.fileprovider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

res/xml/filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images/" path="images/"/>
</paths>
public void shareWith(String appKeyword, String message) {

        //スクリーンショットを取得
        Bitmap bitmap = getScreenBitmap(getWindow().getDecorView());

        try {

            File cachePath = new File(context.getCacheDir(), "images");
            cachePath.mkdirs(); // don't forget to make the directory
            FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
            stream.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        File imagePath = new File(context.getCacheDir(), "images");
        File newFile = new File(imagePath, "image.png");
        Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile);


        List<Intent> shareIntentList = new ArrayList<Intent>();
        //起動するインテントのリスト
        List<ResolveInfo> resolveInfoList =
                getPackageManager().queryIntentActivities(
                        new Intent(Intent.ACTION_SEND).setType("image/png"), 0);
        //SNSアプリの一覧
        for(ResolveInfo info : resolveInfoList){
            Intent shareIntent = new Intent(Intent.ACTION_SEND).setType(
                    "image/png");

            if(info.activityInfo.packageName.toLowerCase().contains(appKeyword)){
                shareIntent.putExtra(Intent.EXTRA_TEXT, message);
                shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(
                        new File(imagePath)));
                shareIntent.setPackage(info.activityInfo.packageName);
                shareIntentList.add(shareIntent);
            }
        }

        //もし該当するアプリが1つでもあれば起動する
        if(!shareIntentList.isEmpty()){


            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
            shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
            shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);


            shareIntent.putExtra(Intent.EXTRA_STREAM, bitmap);
            startActivity(Intent.createChooser(shareIntent, "Choose an app"));

        }
    }

と実装しているのですが、

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:560)

こういったエラーがでて落ちてしまいます。
解決策がわからず、、、調査している段階でした。

何かアドバイス等ご教示頂けると幸いです。
よろしくお願い致します。m(_ _)m

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

cache-pathタグのname属性にスラッシュが入っていますが、これは関係ないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/15 17:21

    コメントありがとうございます!

    shared_images/

    上記のスラッシュのことですかね?

    削除してcleanしてbuildしてみましたが同様のエラーがでました、、、

    キャンセル

  • 2016/12/15 20:55

    プログラム上のどの処理でエラーが発生していますか?

    キャンセル

  • 2016/12/15 20:57

    Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile);

    ここの部分です。

    キャンセル

  • 2016/12/15 21:00

    下記の2点を確認してください。
    ・newFileはnullじゃないか。
    ・File#existでファイルがあるか。

    キャンセル

  • 2016/12/21 18:33

    反応が遅くなってしまい申し訳ございません。

    2つをおこなったところ、

    /data/data/com.example.app/cache/images/image.png

    true

    という結果が得られました。

    キャンセル

  • 2016/12/21 18:36

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

    キャンセル

  • 2016/12/21 18:37

    こんなエラーが吐き出されていました。

    キャンセル

  • 2016/12/21 19:27

    下記のリンクと同じですね。
    http://stackoverflow.com/questions/30896130/fileprovider-crash-npe-attempting-to-invoke-xmlresourceparser-on-a-null-string

    authoritiesが一致しているかもう一度確認してください。

    キャンセル

  • 2016/12/26 15:29

    >authoritiesが一致しているかもう一度確認してください。

    こちら確認してみましたが、一致していましたね...

    キャンセル

同じタグがついた質問を見る

  • Android

    7302questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。