7

システムがスクリーンショットを保存する方法を使用して、ビットマップをディスクとギャラリーに保存しています。これは Android 4.2 以前では機能しますが、Android 4.3 では機能しません。

関連コード:

Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream out = resolver.openOutputStream(uri);

完全なコードはこちら

ただし、4.3 (新しい Nexus 7) では、2 行目にFileNotFoundExceptionが発生します。Web サイトでこれに関連する 4.3 の変更を確認できませんでした。

では、画像をディスクとギャラリーに保存する正しい方法は何ですか?

検証済み:

  • ストレージはこの方法でマウントされます
  • imageUri が null ではない (通常は "content://media/external/images/media/2034" のようなもの)
  • マニフェストには許可 android.permission.WRITE_EXTERNAL_STORAGE があります
4

4 に答える 4

1

これは私がギャラリーに保存bitmapsする方法です:

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri; //instantiate Uri with location of image
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
于 2013-08-06T17:41:51.377 に答える
0

私はマニフェストでこれらの許可を持っています。

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

しかし、私はターゲット SDK バージョン 15 を使用しています。ターゲット SDK 18 を使用しなければならないという要件はありますか?

ところで:

以下は、Facebook からプロフィール写真をダウンロードするためのサンプル コードです。

private class DownloadProfilePicTask extends AsyncTask<Void,String,String> {
    Bitmap profilePic;
    String fileName;
    String id;
    String type;
    URL img_value;
    public DownloadProfilePicTask(String i,String ty)
    {
        id = i;
        if(id==null)
        {
            //Log.v("Id is null", "Error");
        }
        //Log.v("Download Profile Pic Task initialized for id:",id);
        type = ty;
    }
    @Override
    protected String doInBackground(Void...param) {
         String root = Environment.getExternalStorageDirectory().toString();
         if(root==null)
         {
             return null;
         }
         try{
         profilePic = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
         }
         catch (IOException e) {
             e.printStackTrace();

         }

        if(profilePic == null)
        {
            //Log.v("profilePic is null", "Error");
        }
         //Log.v("Root for saving images",root );
         File myDir = new File(root + "/saved_images");
         myDir.mkdirs();
        fileName = root + "/saved_images/" + id + ".png";
        //Log.v("filename is ",fileName);
         File file = new File (fileName); 
         fileName = file.getPath();
         if (file.exists ()) file.delete (); 
         try {
                FileOutputStream out = new FileOutputStream(file);
                profilePic.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
         } catch (Exception e) {
                e.printStackTrace();
         }
         return id;
    }
    @Override
    protected void onPreExecute()
    {
        try
        {
            img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=" + type);
        }
         catch (MalformedURLException e) {
                e.printStackTrace();

        } 

    }
    @Override
    protected void onPostExecute(String result) {
    }
}

そして、私はただ電話します:

new DownloadProfilePicTask(id,type).execute();

画像をダウンロードして自動的に保存します。

注: 正確な場所については、filePath を少し操作する必要があります。

于 2013-08-07T07:11:10.420 に答える
0

マニフェスト ファイルで、ターゲット sdk を 18 に変更してみてください。

  <uses-sdk android:minSdkVersion="7" 
    android:targetSdkVersion="18"/>

それはあなたの問題を解決するかもしれません(そうではないかもしれません)。4.3 JELLY_BEAN_MR2では、android はいくつかの変更を行い、android は、アプリが制限されたプロファイル環境で誤動作する可能性があることを明確に記述しました。http://developer.android.com/about/versions/android-4.3.htmlをご覧ください。

于 2013-08-04T11:15:13.947 に答える
0

Android 4.3 の fileSystem には、dev. 「/sdcard」または「/mnt/sdcard」に直接書き込みますが、android ExternalStorage システムを使用します。( http://source.android.com/devices/tech/storage/index.html )

NB:ExternalStorageは内部メモリにすることができます:p

あなたの場合、に基づく方法を使用しようとしましたgetExternalStorageか? (このように:外部SDカードの場所を見つける

于 2013-08-07T14:24:07.787 に答える