5

我正在尝试向我的应用程序添加一个共享按钮,该按钮会截取屏幕截图,然后通过 Facebook 等进行共享。我已经在互联网上进行了搜索。我也搜索过 Stack Overflow;有很多与此问题相关的线程,但我还无法弄清楚。令我困惑的是..在每个示例中,图像的文件路径都是硬编码的。我确实喜欢那样,但它没有用和动态。我想要做的是截取那一刻的屏幕截图然后分享它,但是当我自己提供文件路径时,它只是从文件夹中获取该图片并分享它

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"));
}

正如您在添加图像部分中看到的那样,我自己给出了文件路径。那么如何给它一个更动态的行为.. 我的意思是当我点击按钮时,我的应用程序的屏幕必须保存在一个文件夹中,然后我可以在不硬编码其文件路径的情况下共享它。

编辑:尝试以下解决方案后;

非常感谢。我在按钮的 onClick 下调用了 shareIt() 并且应用程序停止了......这是日志。

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
4

4 回答 4

2

尝试这个

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();

            // share via intent
            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"));
        } else {
            //Error

        }
    }
于 2013-12-24T07:10:16.213 回答
1

对于将来可能需要解决此问题的任何人,这就是我在我的应用程序中使用的。在 Android 4.0 到 7.1 上测试并运行。

首先,在 Activity 中为可见屏幕定义变量:

    public View preView;

然后启动视图以允许屏幕截图:

    preView = getWindow().getDecorView();

然后,您可以在单击按钮时在 Activity 中调用以下方法。我将此方法放在一个无头类中并根据需要引用它。

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);
    }

}
于 2017-06-21T09:33:12.883 回答
1

截图

 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);
}}

和分享

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"));}

并在点击时添加这些方法

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" />
于 2017-06-21T08:36:27.210 回答
0

尝试将以下行添加到清单文件中

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2014-07-03T10:20:37.380 回答