0

私のアプリでは、ShareActionProvider クラスを介して共有ボタンを追加しています。ファイルシステムから取得した PNG を共有しようとしています。問題は、ストックメッセージングアプリと共有しようとすると、次のエラーがスローされることです

com.google.android.mms.MmsException: /data/data/com.frostbytedev.wifiqr/files/QRCode.png: open failed: EACCES (Permission denied)

最初は自分の権限だと思っていましたが、マニフェストには次の権限があります。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

ファイルシステムから取得しようとする場所は次のとおりです。

Uri uri = Uri.fromFile(new File(getFilesDir(), "/QRCode.png"));
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("image/*");
                intent.putExtra(Intent.EXTRA_STREAM,uri);
                provider.setShareIntent(intent);

あなたが疑問に思っているなら、彼は私が画像を保存するコードです

String fileName = getFilesDir() + "/QRCode.png";
                etSSID.setText(fileName);
                OutputStream stream = null;
                try {
                    stream = new FileOutputStream(fileName);
                    bmp.compress(Bitmap.CompressFormat.PNG, 80, stream);
                    stream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

4

/data/data/com.frostbytedev.wifiqrがアプリのプライベート ディレクトリの場合、はい。アプリにはそのファイルを読み取る権限があります。WRITE_EXTERNAL_STORAGEそれは「あなたの」ディレクトリであるため、許可さえ必要ありません。

ただし、別のアプリと共有すると、そのアプリにもファイルを読み取るためのアクセス許可が必要になります。アプリのプライベート ディレクトリ内のファイルの場合は、デフォルトではそうではありません。表示されるエラーは、アクセス権がない MMS アプリからのものです。

この問題を解決する簡単な方法は、ファイルをすべてのアプリで読み取れる場所に保存することです。基本的にEnvironment.getExternalStorageDirectory().

次の可能性は、そのファイルを他のアプリで読み取れるようにすることですが、それを持っている場所に置いておきます。File#setReadable(true, false)そうすべきです。


Context読み取りモードでファイルを簡単に作成するための優れた方法もあります。

String fileName = getFileStreamPath("QRCode.png").getPath();
etSSID.setText(fileName);
OutputStream stream = null;
try {
    stream = openFileOutput("QRCode.png", Context.MODE_WORLD_READABLE);
    bmp.compress(Bitmap.CompressFormat.PNG, 80, stream);
    stream.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

...

Uri uri = Uri.fromFile(getFileStreamPath("QRCode.png"));
.. share
于 2013-11-15T00:08:14.277 に答える