빡빡종
415
2019-05-24 13:08:57
1
232

[안드로이드] 링크 이미지 저장 후 불러오기 오류 (FileProvider)



이미지URL을 입력하면 스마트폰에 저장한 후 보여지게 하려고 하는데 오류가 납니다 ㅠㅠ


처음에 Uri를 사용했더니 오류가 나서 찾아보니 구글 보안정책이 바뀌면서 누가버전 부터는


파일프로바이더를 이용해야 한다고 하네요


그래서 파일프로바이더 사용법도 찾아보는데 오류로 어플이 튕기지는 않는데


제대로 결과가 출력되지 않습니다.


 메니페스트 부분입니다



<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.myapplication1"> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<application 
android:allowBackup="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:roundIcon="@mipmap/ic_launcher_round" 
android:supportsRtl="true" 
android:theme="@style/AppTheme"> 
<activity android:name=".MainActivity"> 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
<provider 
android:name="android.support.v4.content.FileProvider" 
android:authorities="{package_name}.fileprovider" 
android:exported="false" 
android:grantUriPermissions="true"> 
<meta-data 
android:name="android.support.FILE_PROVIDER_PATHS" 
android:resource="@xml/filepaths" /> 
</provider> 
</application> 
</manifest> 


filepath.xml 코드입니다.


<?xml version="1.0" encoding="utf-8"?> 
<paths> 
<external-path 
name="external_files" 
path="." /> 
</paths> 




메인액티비티.java 코드입니다.



package com.example.myapplication1; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Environment; 
import android.support.v4.content.FileProvider; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
public class MainActivity extends AppCompatActivity { 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    String imgUrl = "https://tpc.googlesyndication.com/daca_images/simgad/3275747697979352250"; 
    new ImageDownload().execute(imgUrl); 
 } 
 /** 
 * url 이미지 다운로드 
 * 
 */ 
 private class ImageDownload extends AsyncTask<String, Void, Void> { 
   /** 
   * 파일명 
   */ 
   private String fileName; 
   /** 
   * 저장할 폴더 
   */ 
   private final String SAVE_FOLDER = "/save_folder"; 
   @Override 
   protected Void doInBackground(String... params) { 
     //다운로드 경로를 지정 
     String savePath = Environment.getExternalStorageDirectory().toString() + SAVE_FOLDER; 
     File dir = new File(savePath); 
     //상위 디렉토리가 존재하지 않을 경우 생성 
     if (!dir.exists()) { 
       dir.mkdirs(); 
    } 
    //파일 이름 :날짜_시간 
    Date day = new Date(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.KOREA); 
    fileName = String.valueOf(sdf.format(day)); 
    //웹 서버 쪽 파일이 있는 경로 
    String fileUrl = params[0]; 
    //다운로드 폴더에 동일한 파일명이 존재하는지 확인 
    if (new File(savePath + "/" + fileName).exists() == false) { 
      } else { 
   } 
   String localPath = savePath + "/" + fileName + ".jpg"; 
   try { 
     URL imgUrl = new URL(fileUrl); 
     //서버와 접속하는 클라이언트 객체 생성 
     HttpURLConnection conn = (HttpURLConnection)imgUrl.openConnection(); 
     int len = conn.getContentLength(); 
     byte[] tmpByte = new byte[len]; 
     //입력 스트림을 구한다 
     InputStream is = conn.getInputStream(); 
     File file = new File(localPath); 
     //파일 저장 스트림 생성 
     FileOutputStream fos = new FileOutputStream(file); 
     int read; 
     //입력 스트림을 파일로 저장 
     for (;;) { 
       read = is.read(tmpByte); 
       if (read <= 0) { 
         break; 
      } 
      fos.write(tmpByte, 0, read); //file 생성 
   } 
   is.close(); 
   fos.close(); 
   conn.disconnect(); 
   } catch (Exception e) { 
   e.printStackTrace(); 
} 
return null; 
} 
@Override 
protected void onPostExecute(Void result) { 
  super.onPostExecute(result); 
  //저장한 이미지 열기 
  Intent i = new Intent(Intent.ACTION_VIEW); 
  i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  String targetDir = Environment.getExternalStorageDirectory().toString() + SAVE_FOLDER; 
  File file = new File(targetDir + "/" + fileName + ".jpg"); 
  //type 지정 (이미지) 
  FileProvider.getUriForFile(getApplicationContext(),"{package_name}.fileprovider",file); 
  //이부분에 원래는 Uri.fromFile(file) 이 코드 부분이 있었습니다.. 
  getApplicationContext().startActivity(i); 
  //이미지 스캔해서 갤러리 업데이트 
  sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); 
} 
} 
} 




어떻게 해야될까요? 제발 고수님들 도와주세요!


0
0
  • 답변 1

  • GAN
    1k
    2019-05-24 15:11:58

    소스에서
    FileProvider.getUriForFile(getApplicationContext(), "{package_name}.fileprovider", file);
    이 부분의 {package_name} 이 그대로 들어가 있다면

    다음처럼 해보세요.
    FileProvider.getUriForFile(getApplicationContext(), getApplicationContext().getPackageName() + ".fileprovider", file);

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.