2016-08-18 8 views
1

내 응용 프로그램에서 Facebook을 사용하기 위해 webview를 사용하고 있습니다. 페이스 북 페이지에서는 이미지가있는 많은 게시물을 찾을 수 있습니다. Facebook에서 이미지를 다운로드하려면 webview 용 longpress 메서드와 HitTestResult 메서드를 사용하고 있습니다. 내 긴 보도 자료가 작동하고 HitTestResult는 내가 longpressed있는 데이터를 가지고 있습니다. URL (https 링크가있는 텍스트)이 제대로 표시됩니다.Facebook에서 WebviewHitResults를 사용하여 webview에서 이미지 URL을 가져올 수 없습니다.

내 문제는 내가 페이스 북 이미지 포스트 (간단히 이미지)에서 이미지를 얻지 못하고 대신 URL 링크 (like-https://something)를 얻고 있다는 것입니다. 이미지에 액세스하여 다운로드하는 방법. 내 활동에

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

:

권한은 내가 매니페스트에 추가

WebSettings settings = ((WebView) findViewById(R.id.webview)).getSettings(); 
settings.setJavaScriptEnabled(true); 
settings.setAllowFileAccess(true); 
settings.setAppCacheEnabled(true); 
settings.setLoadWithOverviewMode(true); 
webView2.setWebViewClient(new PQClient()); 
webView2.setWebChromeClient(new PQChromeClient()); 

하고 여기에

@Override 
protected void onResume() { 
    super.onResume(); 
    final WebView wv = (WebView) findViewById(R.id.webview); 
    wv.setOnLongClickListener(new View.OnLongClickListener() { 
      public boolean onLongClick(View v) { 
       WebView.HitTestResult hitResult = null; 
       hitResult = wv.getHitTestResult(); 
       if (hitResult.getType() == WebView.HitTestResult.IMAGE_TYPE || 
         hitResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { 
        try { 
         String imageUrl = hitResult.getExtra(); 
         Toast.makeText(SocialMediaActivity.this,imageUrl,Toast.LENGTH_LONG).show(); 
         URL url = new URL(imageUrl); 
         HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
         urlConnection.setRequestMethod("GET"); 
         urlConnection.setDoOutput(true); 
         urlConnection.connect(); 

         File sdcard = Environment.getExternalStorageDirectory(); 
         File file = new File(sdcard, "filename.ext"); 

         FileOutputStream fileOutput = new FileOutputStream(file); 
         InputStream inputStream = urlConnection.getInputStream(); 

         byte[] buffer = new byte[1024]; 
         int bufferLength = 0; 

         while ((bufferLength = inputStream.read(buffer)) > 0) { 
          fileOutput.write(buffer, 0, bufferLength); 
         } 
         fileOutput.close(); 

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

       return true; 
      } 
     }); 
    } 

, 내가 생각하는 문제는있는 상태의 경우 어디에서 어느 때문에 longpress를 수행, 그것은 이미지를 반환하지 않지만 URL 링크를 제공합니다. 만약 내가 이미지를 얻을 수있는 로컬 SD 카드에 다운로드 할 수 있습니다.

if (hitResult.getType() == WebView.HitTestResult.IMAGE_TYPE || 
        hitResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) 

이미지를 얻으려면 Bitmap 코드를 사용해 보았습니다.

 @Override 
protected void onResume() { 
    super.onResume(); 
    final WebView wv = (WebView) findViewById(R.id.webview); 
    wv.setOnLongClickListener(new View.OnLongClickListener() { 
      public boolean onLongClick(View v) { 
       WebView.HitTestResult hitResult = null; 
       hitResult = wv.getHitTestResult(); 
        try { 
         String imageUrl = hitResult.getExtra(); 
         URL url = new URL(imageUrl); 
         Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
         Toast.makeText(SocialMediaActivity.this,imageUrl,Toast.LENGTH_LONG).show(); 
         ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
         image.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

        //you can create a new file name "test.jpg" in sdcard folder. 
         File f = new File(Environment.getExternalStorageDirectory() 
           + File.separator + "test.jpg"); 
         f.createNewFile(); 
        //write the bytes in file 
         FileOutputStream fo = new FileOutputStream(f); 
         fo.write(bytes.toByteArray()); 

        // remember close de FileOutput 
         fo.close(); 
        } catch (MalformedURLException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       return true; 
      } 
     }); 
    } 

이 코드를 사용하면 응용 프로그램이 충돌합니다.

+0

링크를 사용하여 비트 맵으로 변환 한 다음 SD 카드에 저장해야합니다. http://stackoverflow.com/a/11831325/3111083 –

+0

실제로 if() 조건을 확인하지 않습니다. IMAGE_TYPE 및 SRC_IMAGE_ANCHOR_TYPE을 의미합니다. 그래서 내가 오랫동안 이미지를 누르면 아무 일도 일어나지 않습니다. –

+0

디버그 모드에서 응용 프로그램을 테스트 했으므로 if() 조건을 실행하지 않는다는 것을 알게되었습니다. 하지만 히트 결과 URL 링크가 있습니다. –

답변

0

문제가 확실하지 않습니다. 당신이 그 이미지의 URL을 얻을 수 있다면 그 이미지를 다운로드하려고 할 수 있습니다.

하지만 다운로드 코드를 클릭 처리기에 넣었습니다. 그래서 그것은 메인 스레드에서 실행될 것입니다. 그러면 LogCat에 NetworkOnMainThreadException이 명확하게 표시됩니다.

이 문제를 방지하려면 다운로드 코드를 스레드 또는 AsyncTask에 저장해야합니다.

+0

예 위의 코드가 맞지 않으면 이미지의 URL을 가져올 수 있으며 더 이상 수행 할 단계를 알 수 없습니다 ..! 위의 코드와 관련된 Asynk Task를 사용하도록 유도 해주십시오. –

+0

매일 AsyncTask를 사용하여 웹에서 무언가를 다운로드하고 파일 또는 다른 것으로 저장하는 예제를 찾을 수 있습니다. 그냥 '안드로이드'태그가있는 페이지를 여기에서 읽으십시오. 아니면 구글. 코드에서 작동해서는 안되는 특별한 것은 없습니다. – greenapps

+0

비동기 작업을 사용하여 webview에서 이미지를 다운로드하려고 시도했지만 정상적으로 작동합니다. 하지만 난 webview에서 페이스 북을 사용하고 있습니다. 그래서 나는 페이 스북 (게시물, 프로필 사진 등 ..)에서 그들에 대한 긴 언론에 이미지를 다운로드해야합니다. 언제 내가 어떤 이미지를 오래 눌러, 그 이미지 페이지의 URL 링크를 받고 있어요. 그들에 longpress에 facebook에서 심상을 다운로드하는 방법 URL 연결을 다운로드하는 정상 심상을위한 –

관련 문제