2012-08-30 1 views
3

에서 다운로드 할 때 파일을 오는 : 여기안드로이드 : 나는 그것은 예외가 여기에 예외를 나에게</p> <p>을 제공 아마존 S3에서 이미지 파일 다운로드를 시도하고 때 예외 내 안드로이드 응용 프로그램에서 AmazonS3

08-30 11:20:34.157: W/System.err(6519): android.os.NetworkOnMainThreadException 
08-30 11:20:34.157: W/System.err(6519): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
08-30 11:20:34.157: W/System.err(6519):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
08-30 11:20:34.157: W/System.err(6519):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
08-30 11:20:34.157: W/System.err(6519):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
08-30 11:20:34.157: W/System.err(6519):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
08-30 11:20:34.168: W/System.err(6519):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
08-30 11:20:34.168: W/System.err(6519):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
08-30 11:20:34.168: W/System.err(6519):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
08-30 11:20:34.177: W/System.err(6519):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-30 11:20:34.177: W/System.err(6519):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-30 11:20:34.177: W/System.err(6519):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-30 11:20:34.177: W/System.err(6519):  at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:285) 
08-30 11:20:34.177: W/System.err(6519):  at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:167) 
08-30 11:20:34.187: W/System.err(6519):  at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2781) 
08-30 11:20:34.187: W/System.err(6519):  at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:872) 
08-30 11:20:34.187: W/System.err(6519):  at com.example.amazons3.AmazonS3DemoActivity.Download(AmazonS3DemoActivity.java:74) 
08-30 11:20:34.187: W/System.err(6519):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-30 11:20:34.187: W/System.err(6519):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-30 11:20:34.187: W/System.err(6519):  at android.view.View$1.onClick(View.java:3039) 
08-30 11:20:34.197: W/System.err(6519):  at android.view.View.performClick(View.java:3511) 
08-30 11:20:34.197: W/System.err(6519):  at android.view.View$PerformClick.run(View.java:14105) 
08-30 11:20:34.197: W/System.err(6519):  at android.os.Handler.handleCallback(Handler.java:605) 
08-30 11:20:34.197: W/System.err(6519):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-30 11:20:34.207: W/System.err(6519):  at android.os.Looper.loop(Looper.java:137) 
08-30 11:20:34.207: W/System.err(6519):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
08-30 11:20:34.207: W/System.err(6519):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-30 11:20:34.207: W/System.err(6519):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-30 11:20:34.217: W/System.err(6519):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
08-30 11:20:34.227: W/System.err(6519):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
08-30 11:20:34.227: W/System.err(6519):  at dalvik.system.NativeStart.main(Native Method) 

그것을 내를 java 코드 :

public class AmazonS3Activity extends Activity 
{ 
private String Tag = "Downlaod"; 

Button btnDownload; 

Context myContext; 

String product_code = "pro_code"; 

String bucketName = "bucketnamw"; 

String appDirPath = Environment.getExternalStorageDirectory().getName() +"/foldername/"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    myContext = this; 

    btnDownload = (Button) findViewById(R.id.btnDownload);  
} 

public void Download(View button) 
{ 
    try 
    { 
     String imgName = product_code+"1.jpg"; 
     String md5Name = getMD5HasCode(product_code); 

     String productCode = md5Name+".app/"; 

     String filePath = getFullFilePath(imgName); 

     String accessKey = "accessKey"; 
     String secretKey = "secretKey"; 
     AWSCredentials credential = new BasicAWSCredentials(accessKey, secretKey); 

     Log.e(Tag, "FileName : " + filePath, null); 

     String strObjectKey = productCode + imgName.replace(product_code,md5Name); 

     Log.e(Tag, "Object Key : " + strObjectKey, null); 

     GetObjectRequest objRequest = new GetObjectRequest(bucketName,strObjectKey); 

     AmazonS3Client myS3Client = new AmazonS3Client(credential); 

     S3Object s3Object = myS3Client.getObject(objRequest); 

     long fileSize = s3Object.getObjectMetadata().getContentLength(); 
     final InputStream input = s3Object.getObjectContent(); 
     final FileOutputStream fos = new FileOutputStream(filePath); 

     long total = 0; 
     int len=0; 

     byte[] buf = new byte[1024]; 

     while((len = input.read(buf)) > 0) 
     { 
      fos.write(buf,0,len); 

      total = total + len; 
     } 

     if(len == -1 && total==fileSize) 
     { 
      Thread.currentThread().interrupt(); 

      input.close(); 
      fos.close(); 

     } 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     Log.e(Tag, "Error Key : " + e.getMessage(), null); 
    } 

} 

public String getMD5HasCode(String strMessage) 
{ 
    try 
    { 
     MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
     byte[] messageDigestBytes = messageDigest.digest(strMessage.getBytes()); 
     BigInteger hasNumber = new BigInteger(1,messageDigestBytes); 
     String md5 = hasNumber.toString(16); 

     while(md5.length()<32) 
     { 
      md5 = "0" + md5; 
     } 

     return md5; 
    } 
    catch (Exception ex) 
    { 
     Toast.makeText(myContext, "ERROR in HasCode : "+ex.toString(), Toast.LENGTH_SHORT).show(); 
     return null; 
    } 
} 

public String getFullFilePath(String filename) 
{ 
    File dir = new File(appDirPath); 
    if(!dir.exists()) 
    { 
     dir.mkdir(); 
    } 
    return appDirPath+filename; 
} 
} 
+0

당신의 N/W 활동이 메인 스레드에 있고 엄격한 모드 정책을 사용하고 있지 않기 때문에 위의 2.3과 같은 용도로 사용하십시오. 비동기 작업으로 다운로드를 시도하십시오 –

+0

감사합니다. 비동기 작업에서 작동합니다. 하지만 같은 코드는 내가 태블릿에서 실행하려고하면 다음과 같은 오류가 발생합니다 : 요청 시간과 현재 시간의 차이가 너무 큼 – Mansi

+0

@Mansi 전체 코드 샘플 또는 튜토리얼을 가지고 있습니까? 이 튜토리얼을 작성하면 행복 할 것입니다. 감사합니다.^_^ – Cjames

답변

3

설명서의 현재 위치는 here입니다.

NetworkOnMainThreadException은 응용 프로그램이 주 스레드에서 네트워킹 작업을 수행하려고 할 때 발생합니다.

이것은 Honeycomb SDK 또는 을 타겟팅하는 애플리케이션에서만 발생합니다. 이전 SDK 버전을 대상으로하는 응용 프로그램은 기본 이벤트 루프 스레드에서 네트워킹을 허용하지만 크게는 입니다.

솔루션은 네트워크 관련 작업에 AsyncTask을 사용할 수 있습니다.

+0

감사합니다. 비동기 작업에서 작동합니다. 하지만 같은 코드는 내가 태블릿에서 실행하려고하면 다음과 같은 오류가 발생합니다 : 요청 시간과 현재 시간의 차이가 너무 큽니다. – Mansi

+0

http://www.bucketexplorer.com/documentation/amazon-s3--difference-between-requesttime-currenttime-too-large.html이 문제를 이해하고 해결하는 데 도움이 될 수 있습니다. – Vinay

+0

감사합니다. 그 작품들 – Mansi

관련 문제