2017-10-01 8 views
0

C++のAndroidアプリケーションでbmpをファイルに保存しようとしています(私はchromiumプロジェクトで作業しています)。Nexus5xのAndroidデバイスでfopenが失敗する理由(C++)

FILE* fp = fopen("/myimage.bmp", "wb"); // result: fp==NULL, errno==30 

FILE* fp = fopen("/Pictures/myimage.bmp", "wb"); // result: fp==NULL, errno==2 

電話機は、sdcardを持たないNexus 5xです。 android.permission.WRITE_EXTERNAL_STORAGEおよびandroid.permission.WRITE_INTERNAL_STORAGEが設定される。

無効なパスを使用しているようですか?どちらのパスが有効でしょうか?デバッグ出力ですので、動作するパスが必要です。

+1

Linuxベースのシステムでスーパーユーザーレベルの特権なしで '/'に書き込むことはできません。 「私はクロムプロジェクトで作業しています」 - 次に、Chromiumがファイルを書き込む場所を見つけ出し、そこにファイルを書き込む。 – CommonsWare

答えて

0

、あなたのアプリケーションのあなたの内部ストレージにアクセスしている場合は、あなたのアプリケーションストレージのルートパスが

String ROOT_PATH = "/data/data/" + "com.your.package.name" + "/"; 

だからあなたの内部ストレージからファイルにアクセスする場合にはあなたのようなファイルパスを宣言する必要がありますこの。

FILE* fp = fopen(ROOT_PATH + "myimage.bmp", "wb"); 

しかし、これは@CommonsWareが示唆したように、あなたの問題が解決されるように保証するものではありません、

は、「アプリケーションのストレージのルートパスがある」 - パスは OSのバージョン、ユーザーによって異なりますアカウント(プライマリとセカンダリ)、可能であればデバイス メーカー決してハーディードパッドをしないでください。 NDKコードが の場所に書き込む必要がある場合は、Javaコードがパス(たとえば、getFilesDir()など)から導かれた である必要があります。

私はあなたの質問に再び彼のコメントを参照しています。

Linuxベースのシステムでは、 スーパーユーザレベルの特権なしで書き込みできません。 "私はクロムプロジェクトで働いています" - Chromiumがどこにファイルを書き込むか把握し、そこでファイル を書きます。

これは、@ CommonSWareが示唆している貴重な洞察です。ありがとう。

+0

"アプリケーションストレージのルートパスは" - パスはOSのバージョン、ユーザーアカウント(プライマリとセカンダリ)、デバイスメーカーによって異なる場合があります。決してハーディードパッドをしないでください。 NDKコードが場所に書き込む必要がある場合、Javaコードはパス(getFilesDir()など)から派生したパスを渡す必要があります。 – CommonsWare

+0

すばらしい説明!あなたの親切なコメントに感謝します。私はそれが推奨されていないとして私の答えを削除しています。再度、感謝します。 –

+0

不適切な場所への書き込みに関するあなたの意見は良いです。また、軽量なデバッグのために、ハードコードされた値が機能する可能性があります。私は開発者が "realzのために"使うことができると推測し、デバイス間で動作させることを心配しています。 – CommonsWare

関連する問題