2013-10-06 24 views
4

我想一個分享按鈕添加到我的應用程序,它通過Facebook等我尋覓通過互聯網採用的屏幕截圖,然後共享它。我也搜索過堆棧溢出;有很多與這個問題有關的線索,但我還沒有弄清楚。令我困惑的是..在每個例子中,圖像的文件路徑都是硬編碼的。我喜歡那樣,但它沒有用處和動態。我所試圖做的是採取的那一刻截圖,然後分享它,但是當我自己給的文件路徑,它只是需要那張圖片從一個文件夾並分享了機器人採取的截圖和分享它

public void clickButton(View v) { 
    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); 

    //set the type 
    shareIntent.setType("image/png"); 

    //add a subject 
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
      "CAR EXAMPLE"); 

    //build the body of the message to be shared 
    String shareMessage = "An app..."; 

    //add the message 
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareMessage); 

    //add the img 
    shareIntent.putExtra(Intent.EXTRA_STREAM, 
      Uri.parse("/storage/sdcard0/Tutorial_ScreenShot/screenshot0.jpg")); 

    //start the chooser for sharing 
    startActivity(Intent.createChooser(shareIntent, "Share")); 
} 

正如你所看到的添加圖像部分我自己給出了文件路徑。因此,如何提供一個更動態行爲給..我的意思是,當我按一下按鈕我的應用程序的屏幕必須被保存在一個文件夾中,然後我可以共享沒有硬編碼文件路徑它。

編輯: 嘗試下面的解決方案後,

好,謝謝。我叫shareIt()右下它和應用程序停止...... 這裏按鈕的onClick是日誌。

12-28 15:53:01.660: E/AndroidRuntime(14120): FATAL EXCEPTION: main 
12-28 15:53:01.660: E/AndroidRuntime(14120): Process: com.hede.namesurfer, PID: 14120 
12-28 15:53:01.660: E/AndroidRuntime(14120): java.lang.NullPointerException 
12-28 15:53:01.660: E/AndroidRuntime(14120): at  
com.hede.namesurfer.MainActivity.share(MainActivity.java:161) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
    com.hede.namesurfer.MainActivity$1.onClick(MainActivity.java:42) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.view.View.performClick(View.java:4438) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.view.View$PerformClick.run(View.java:18422) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.os.Handler.handleCallback(Handler.java:733) 

12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.os.Handler.dispatchMessage(Handler.java:95) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.os.Looper.loop(Looper.java:136) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
android.app.ActivityThread.main(ActivityThread.java:5017) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
java.lang.reflect.Method.invokeNative(Native Method) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
java.lang.reflect.Method.invoke(Method.java:515) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
12-28 15:53:01.660: E/AndroidRuntime(14120): at  
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 

12-28 15:53:01.660: E/AndroidRuntime(14120): at  
dalvik.system.NativeStart.main(Native Method) 
12-28 15:53:02.780: I/Process(14120): Sending signal. PID 
+0

[您將在這裏找到你的解決方案(https://stackoverflow.com/a/44670639/7499305) –

回答

1

試試這個

public void shareit() 
    { 
     View view = findViewById(R.id.layout);//your layout id 
     view.getRootView(); 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) 
     { 
      File picDir = new File(Environment.getExternalStorageDirectory()+ "/myPic"); 
      if (!picDir.exists()) 
      { 
       picDir.mkdir(); 
      } 
      view.setDrawingCacheEnabled(true); 
      view.buildDrawingCache(true); 
      Bitmap bitmap = view.getDrawingCache(); 
//   Date date = new Date(); 
      String fileName = "mylove" + ".jpg"; 
      File picFile = new File(picDir + "/" + fileName); 
      try 
      { 
       picFile.createNewFile(); 
       FileOutputStream picOut = new FileOutputStream(picFile); 
       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2)); 
       boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut); 
       if (saved) 
       { 
        Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show(); 
       } else 
       { 
        //Error 
       } 
       picOut.close(); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      view.destroyDrawingCache(); 
     } else { 
      //Error 

     } 




     Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
     sharingIntent.setType("image/jpeg"); 
     sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(picFile.getAbsolutePath())); 
     startActivity(Intent.createChooser(sharingIntent, "Share via")); 
    } 
+0

所以在這種情況下是什麼picDir和picFile?可能會說他們無法解決變量.. – regeme

+0

@regeme我編輯 – Singhak

+0

我編輯的問題 – regeme

0

嘗試添加到您的清單文件的行

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

爲screeshot

public Bitmap takeScreenshot() { 
View rootView = findViewById(android.R.id.content).getRootView(); 
rootView.setDrawingCacheEnabled(true); 
return rootView.getDrawingCache(); } 

保存截圖

private void saveBitmap(Bitmap bitmap) { 
imagePath = new File(Environment.getExternalStorageDirectory() + "/scrnshot.png"); ////File imagePath 
FileOutputStream fos; 
try { 
    fos = new FileOutputStream(imagePath); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
    fos.flush(); 
    fos.close(); 
} catch (FileNotFoundException e) { 
    Log.e("GREC", e.getMessage(), e); 
} catch (IOException e) { 
    Log.e("GREC", e.getMessage(), e); 
}} 

和上點擊

shareScoreCatch.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          Bitmap bitmap = takeScreenshot(); 
          saveBitmap(bitmap); 
          shareIt(); 
         } 
        }); 

,並在清單

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

感謝注:將爲targetSdkVersion <24由於Android的N.介紹權限要求只工作 –

0

對任何人說可能需要在解決這一共享

private void shareIt() { 
Uri uri = Uri.fromFile(imagePath); 
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
sharingIntent.setType("image/*"); 
String shareBody = "My highest score with screen shot"; 
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Catch score"); 
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody); 
sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); 

startActivity(Intent.createChooser(sharingIntent, "Share via"));} 

,並添加這些方法未來,這是我在我的應用程序中使用的。經過測試並使用Android 4.0至7.1。

首先,定義變量在活動的可視屏幕:

public View preView; 

然後啓動視圖允許截圖:

preView = getWindow().getDecorView(); 

然後就可以調用內的下列方法你單擊按鈕時的活動。我將這種方法放在無頭課中,並根據需要參考它。

public static void takeScreenShotAndShare(final Context context, View view, boolean incText, String text){ 
    try{ 

     File mPath = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "screenshot.png"); 
     //File imageDirectory = new File(mPath, "screenshot.png"); 

     view.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); 
     view.setDrawingCacheEnabled(false); 

     FileOutputStream fOut = new FileOutputStream(mPath); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.PNG, quality, fOut); 
     fOut.flush(); 
     fOut.close(); 

     final Intent shareIntent = new Intent(Intent.ACTION_SEND); 
     Uri pictureUri = Uri.fromFile(mPath); 
     shareIntent.setType("image/*"); 
     if(incText){ 
      shareIntent.putExtra(Intent.EXTRA_TEXT, text); 
     } 
     shareIntent.putExtra(Intent.EXTRA_STREAM, pictureUri); 
     shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     context.startActivity(Intent.createChooser(shareIntent, "Share image using")); 
    }catch (Throwable tr){ 
     Log.d(TAG, "Couldn't save screenshot", tr); 
    } 

}