フォトギャラリーから画像ファイルを選択し、SDカードに書き込もうとしています。以下は、例外が発生するコードです。 FileOutputStreamを作成しようとすると、この例外がスローされるようです。 application要素内にネストされたマニフェストファイルに次の行を追加しました。問題の解決策が見つかりません:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
public boolean saveSelectedImage( Uri selectedImage, int imageGroup,
int imageNumber )
{
boolean exception = false;
InputStream input = null;
OutputStream output = null;
if( externalStorageIsWritable() )
{
try
{
ContentResolver content = ctx.getContentResolver();
input = content.openInputStream( selectedImage );
if(input != null) Log.v( CLASS_NAME, "Input Stream Opened successfully");
File outFile = null;
File root = Environment.getExternalStorageDirectory( );
if(root == null) Log.v(CLASS_NAME, "FAILED TO RETRIEVE DIRECTORY");
else Log.v(CLASS_NAME, "ROOT DIRECTORY is:"+root.toString());
output = new FileOutputStream( root+"/Image"+ imageGroup + "_" + imageNumber + ".png" );
if(output != null) Log.e( CLASS_NAME, "Output Stream Opened successfully");
// output = new FileOutputStream
// ("/sdcard/Image"+imageGroup+"_"+imageNumber+".png");
byte[] buffer = new byte[1000];
int bytesRead = 0;
while ( ( bytesRead = input.read( buffer, 0, buffer.length ) ) >= 0 )
{
output.write( buffer, 0, buffer.length );
}
} catch ( Exception e )
{
Log.e( CLASS_NAME, "Exception occurred while moving image: ");
e.printStackTrace();
exception = true;
} finally
{
// if(input != null)input.close();
// if(output != null)output.close();
// if (exception ) return false;
}
return true;
} else
return false;
}
マニフェストファイルは次のようになります
<application Android:icon="@drawable/icon" Android:label="@string/app_name">
<activity Android:name=".WriteCBTextToFileActivity"
Android:label="@string/app_name">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
私はこの問題を抱えていましたが、ここでの答えはそれを修正しませんでした。かなり愚かな間違いをしたからです。
AndroidエミュレータにSDカードを与えるようにしてください... SDカードのサイズを空白のままにしていたので、もちろん何も見つかりませんでした。その上で、まだ作成されていないSDカード内のディレクトリを指定するので、その場合も考慮してください。
(Android Virtual Device Managerに移動し、選択したエミュレータを編集して、SDカードサイズの値を入力することで、AVDのSDカード設定を変更できます)
また、外部ストレージサブシステムが正しい状態であることも確認する必要があります。 Environment.getExternalStorageState()
を使用して、唯一の安全な状態であるEnvironment.MEDIA_MOUNTED
を探します。
また、これらのセクションを中心に例外処理をIOException
に限定することもお勧めします。これにより、IO固有の問題から過度に回復しないようにします。メディアがアンマウントされました。
イベントが必要な場合は、IntentListener
で登録できるのと同じ情報を持つブロードキャストインテント(Intent.ACTION_MEDIA_xxx
)があります。
また、USBをデバッグに使用している場合、外部ストレージがdisabledになる可能性があることに注意してください。
また、デバイスの起動中は外部ストレージが利用できない期間が長くなります。起動時にサービスを操作する場合、これは問題です。
一般に、アプリケーションは外部ストレージにアクセスするときにその状態を認識し、アクセスできない場合やアクセス中に使用できなくなった場合に対処する必要があります。
マニフェストに正しい権限が設定されている場合は、PCに接続するときにデバイスが「ディスクドライブ」モードになっていないことを確認してください。 「充電のみ」モードに変更すれば、機能するはずです。
Saurabhの回答に加えて、API 23以降は実行時に権限をリクエストする必要があることに注意してください。
ここを参照してください: https://developer.Android.com/training/permissions/requesting.html
そして、ここでのジャスティン・フィードラーの答え: https://stackoverflow.com/a/33288986/328059
また、権限を変更してInstant Runを使用してアプリを再実行した後、権限が更新されない場合がいくつかありました。したがって、ベストプラクティスとして、マニフェストを変更した後、ターゲットデバイスからアプリをアンインストールして再構築します。
あなたは試すことができます:
String myPath=Environment.getExternalStorageDirectory()+"/Image"+ imageGroup + "_" + imageNumber + ".png";
File myFile = new File();
input = new FileInputStream(myFile);
自分で場所を指定する代わりに、openFileOutput("filename")
を使用してFileOutputStreamを返すようにしてください。
ドキュメントをチェック ここ