2017-03-24 6 views
0

내 앱 기능은 Json에서 맞춤형 어댑터로 여러 이미지를 표시하고 싶습니다. 이제는 필요한 모든 이미지를 다운로드해야합니다. 사용자가 다운로드 버튼을 클릭하면 특정 조각이 외부 메모리에 저장됩니다.Android- json 및 Picasso를 사용하여 URL에서 외부 저장소로 이미지를 다운로드 할 수 없습니다.

가 나는 파일 참고 권한 준 : 이미지를 추출하고 피카소를 사용하여 다운로드

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

코드 것은 :

public class AKVSeriesOneFragment extends Fragment { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private View view; 
// Movies json url 
private static final String url = "https://developers.kurtisgallery.in/example_api/kurtisone/id/8"; 
private ProgressDialog pDialog; 
private List<Movie> movieList = new ArrayList<Movie>(); 
private GridView gridView; 
private CustomListAdapter adapter; 


public AKVSeriesOneFragment() { 
    // Required empty public constructor 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 




} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 


    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_akvseries_one, container, false); 
    ImageView imageView = (ImageView) rootView.findViewById(R.id.downoadimgs); 

    imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 


      for (int i = 0; i < movieList.size(); i++) { 

       String url = movieList.get(i).getThumbnailUrl(); 
       Picasso.with(getContext()) 
         .load(url) 
         .into(new Target() { 
          @Override 
          public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 

           new Thread(new Runnable() { 
            @Override 
            public void run() { 

             File sd = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
             File folder = new File(sd, "/Picasso/"); 
             if (!folder.exists()) { 
              if (!folder.mkdir()) { 
               Log.e("ERROR", "Cannot create a directory!"); 
              } else { 
               folder.mkdir(); 
              } 
             } 




             for (int i=0; i< movieList.size(); i++) { 

              File[] fileName = {new File("Image"+i)}; 

              if (!fileName[i].exists()) { 
               try { 
                fileName[i].createNewFile(); 
               } catch (IOException e) { 
                e.printStackTrace(); 
               } 
              } else { 

               try { 
                FileOutputStream outputStream = new FileOutputStream(String.valueOf(fileName[i])); 
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
                outputStream.close(); 

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

             } 

            } 
           }).start(); 

          } 

          @Override 
          public void onBitmapFailed(Drawable errorDrawable) { 

          } 

          @Override 
          public void onPrepareLoad(Drawable placeHolderDrawable) { 

          } 
         }); 
      } 



     } 
    }); 

    gridView = (GridView) rootView.findViewById(R.id.list); 
    adapter = new CustomListAdapter(getActivity(), movieList); 
    gridView.setAdapter(adapter); 

    pDialog = new ProgressDialog(getActivity()); 
    // Showing progress dialog before making http request 
    pDialog.setMessage("Loading..."); 
    pDialog.show(); 

    JsonArrayRequest movieReq = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d(TAG, response.toString()); 
        hidePDialog(); 

        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          Movie movie = new Movie(); 
          //movie.setTitle(obj.getString("category_name")); 
          movie.setThumbnailUrl(obj.getString("thumb_img_dest")); 
        movieList.add(movie); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // notifying list adapter about data changes 
        // so that it renders the list view with updated data 
        adapter.notifyDataSetChanged(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      hidePDialog(); 

     } 
    }); 

    // Adding request to request queue 
    AppController.getInstance().addToRequestQueue(movieReq); 

    return rootView; 
} 

Here I am getting error EROFS (Read-only file system) 내가 유래 전에 검색과 많은 유사한 probleb하지만 비를 발견했다 솔루션의 나를 위해 일하고있다. 나는 초보자 안드로이드 개발자입니다.

+0

내 이미지가 성공적으로 표시됩니다. –

+0

마치'if (! fileName [0] .exists()) {' –

+0

@DaniweNugent 문제는 ​​이전과 동일하게 유지됩니다. –

답변

0

mashmallow에 대한 권한으로 인해 코드가 올바르지 만 문제가 발생했습니다. 그래서 나는이 코드를했다 :

private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE 
}; 

//persmission method. 
public static void verifyStoragePermissions(Activity activity) { 
    // Check if we have read or write permission 
    int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); 

    if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 

을 활동 파일에 내가

verifyStoragePermissions(this); 

이 누군가를 도와 희망이 함수를 호출!