Webview中的深层链接

时间:2018-03-30 14:03:28

标签: android webview

我一直在为SHPE的Stony Brook章节开发一个WebView应用程序,我试图实现深层链接,如果用户点击或打开浏览器中的URL,它将在应用程序中打开。我已经完成了所有工作,甚至为工作发布部分上传文件,我在网站上禁用了ajax,因为它导致了问题。缓存我不确定实际上是否正常运行,但就目前而言,我只是希望深层链接工作,因为该网站使用OneSignal进行通知,而它们只是在点击时在浏览器中打开。如果我可以在应用程序中捕获URL并从stonybrookshpe.org打开任何内容,它将解决我的问题,但我被卡住了,谢谢。继承我的MainActivity.java

package org.stonybrookshpe.stonybrookshpe;

import android.Manifest;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.content.res.Configuration;

import android.net.ConnectivityManager;

import android.net.Uri;

import android.os.Build;

import android.os.Bundle;

import android.os.Environment;

import android.provider.MediaStore;

import android.support.annotation.NonNull;

import android.support.v4.app.ActivityCompat;

import android.support.v4.content.ContextCompat;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.webkit.ValueCallback;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.webkit.WebResourceError;

import android.webkit.WebResourceRequest;

import java.io.File;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import com.onesignal.OneSignal;


public class MainActivity extends AppCompatActivity {


    WebView webView;

    ConnectivityManager cM;

    private static final String TAG = MainActivity.class.getSimpleName();

    private String mCM;

    private ValueCallback<Uri> mUM;

    private ValueCallback<Uri[]> mUMA;

    private final static int FCR = 1;


    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

        super.onActivityResult(requestCode, resultCode, intent);
        if (Build.VERSION.SDK_INT >= 21) {

            Uri[] results = null;

            //Check if response is positive

            if (resultCode == Activity.RESULT_OK) {

                if (requestCode == FCR) {

                    if (null == mUMA) {

                        return;

                    }

                    if (intent == null || intent.getData() == null) {

                        //Capture Photo if no image available

                        if (mCM != null) {

                            results = new Uri[]{Uri.parse(mCM)};

                        }

                    } else {

                        String dataString = intent.getDataString();

                        if (dataString != null) {

                            results = new Uri[]{Uri.parse(dataString)};

                        }

                    }

                }

            }

            mUMA.onReceiveValue(results);

            mUMA = null;

        } else {

            if (requestCode == FCR) {

                if (null == mUM) return;

                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();

                mUM.onReceiveValue(result);

                mUM = null;

            }

        }

    }


    @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        // OneSignal Initialization

        OneSignal.startInit(this)

                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)

                .unsubscribeWhenNotificationsAreDisabled(true)

                .init();

        OneSignal.setEmail("sbshpe@gmail.com");


        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= 23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {

            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);

        }

        webView = (WebView) findViewById(R.id.ifView);

        assert webView != null;

        WebSettings webSettings = webView.getSettings();

        webSettings.setJavaScriptEnabled(true);

        webSettings.setAllowFileAccess(true);

        webSettings.setAllowFileAccess(true);

        if (Build.VERSION.SDK_INT >= 21) {

            webSettings.setMixedContentMode(0);

            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

        } else if (Build.VERSION.SDK_INT >= 19) {

            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

        } else if (Build.VERSION.SDK_INT < 19) {

            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        }

        webView.setWebViewClient(new Callback());


        cM = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);

        if(cM != null && cM.getActiveNetworkInfo() != null && cM.getActiveNetworkInfo().isConnected()){

            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

            webView.loadUrl("http://stonybrookshpe.org");

        }

        else{

            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

            webView.loadUrl("http://stonybrookshpe.org");

        }

        webView.setWebChromeClient(new WebChromeClient() {

            //For Android 3.0+

            public void openFileChooser(ValueCallback<Uri> uploadMsg) {

                mUM = uploadMsg;

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);

                i.addCategory(Intent.CATEGORY_OPENABLE);

                i.setType("*/*");

                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FCR);

            }

            // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this

            public void openFileChooser(ValueCallback uploadMsg, String acceptType) {

                mUM = uploadMsg;

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);

                i.addCategory(Intent.CATEGORY_OPENABLE);

                i.setType("*/*");

                MainActivity.this.startActivityForResult(

                        Intent.createChooser(i, "File Browser"),

                        FCR);

            }

            //For Android 4.1+

            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {

                mUM = uploadMsg;

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);

                i.addCategory(Intent.CATEGORY_OPENABLE);

                i.setType("*/*");

                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR);

            }

            //For Android 5.0+

            public boolean onShowFileChooser(

                    WebView webView, ValueCallback<Uri[]> filePathCallback,

                    WebChromeClient.FileChooserParams fileChooserParams) {

                if (mUMA != null) {

                    mUMA.onReceiveValue(null);

                }

                mUMA = filePathCallback;

                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                if (takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) {

                    File photoFile = null;

                    try {

                        photoFile = createImageFile();

                        takePictureIntent.putExtra("PhotoPath", mCM);

                    } catch (IOException ex) {

                        Log.e(TAG, "Image file creation failed", ex);

                    }

                    if (photoFile != null) {

                        mCM = "file:" + photoFile.getAbsolutePath();

                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));

                    } else {

                        takePictureIntent = null;

                    }

                }

                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);

                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);

                contentSelectionIntent.setType("*/*");

                Intent[] intentArray;

                if (takePictureIntent != null) {

                    intentArray = new Intent[]{takePictureIntent};

                } else {

                    intentArray = new Intent[0];

                }


                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);

                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);

                chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");

                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);

                startActivityForResult(chooserIntent, FCR);

                return true;

            }

        });

    }

    public class Callback extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {


            /*
           Log.i(TAG, "shouldOverrideUrlLoading: " + url);
            Intent intent;


             if (url.contains(AppConstants.http://stonybrookshpe.org)) {
           if (Uri.parse(url).getHost().equals("stonybrookshpe.org")) {

                view.loadUrl(url);

                return true;
           }
*/


            if (url.startsWith("mailto:")) {
                // We use `ACTION_SENDTO` instead of `ACTION_SEND` so that only email programs are launched.
                Intent emailIntent = new Intent(Intent.ACTION_SENDTO);

                // Parse the url and set it as the data for the `Intent`.
                emailIntent.setData(Uri.parse(url));

                // `FLAG_ACTIVITY_NEW_TASK` opens the email program in a new task instead as part of this application.
                emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                // Make it so.
                startActivity(emailIntent);

                return true;

            }

            else {

                    if (Uri.parse(url).getHost().equals("stonybrookshpe.org")) {

                        return false;

                    }

            }


            return true;
            /*
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
*/


        }


        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            String html = "";
            String mime = "text/html";
            String encoding = "utf-8";

            //webview myWebView = (WebView)this.findViewById(R.id.ifView);
            webView.loadDataWithBaseURL(null, html, mime, encoding, null);

        }

    }

    // Create an image file

    private File createImageFile() throws IOException {

        @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

        String imageFileName = "img_" + timeStamp + "_";

        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

        return File.createTempFile(imageFileName, ".jpg", storageDir);

    }

    @Override

    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {

        if (event.getAction() == KeyEvent.ACTION_DOWN) {

            switch (keyCode) {

                case KeyEvent.KEYCODE_BACK:

                    if (webView.canGoBack()) {

                        webView.goBack();

                    } else {

                        finish();

                    }

                    return true;

            }

        }

        return super.onKeyDown(keyCode, event);

    }


    /*
    @Override

    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

    }
    */

}

和我的AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="org.stonybrookshpe.stonybrookshpe">

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

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

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

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

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


    <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/StonyBrookSHPE">

        <activity android:name=".MainActivity"

            android:theme="@style/StonyBrookSHPE">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

            <intent-filter>

                <category android:name="android.intent.category.DEFAULT" />


                <category android:name="android.intent.category.BROWSABLE" />

                <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->

                <data android:scheme="http"

                    android:host="stonybrookshpe.org"

                    android:pathPrefix="/" />

                <!-- note that the leading "/" is required for pathPrefix-->

            </intent-filter>

        </activity>

    </application>


</manifest>

1 个答案:

答案 0 :(得分:0)

试试此代码

 public class OnesignalApi extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        OneSignal.startInit(this)
                .setNotificationOpenedHandler(new NotificationOpenedHandler())
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .unsubscribeWhenNotificationsAreDisabled(true)
                .init();
    }




    private class NotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
        // This fires when a notification is opened by tapping on it.
        @Override
        public void notificationOpened(OSNotificationOpenResult result) {
            String launchUrl = result.notification.payload.launchURL;
            Object activityToLaunch = WebviewActivity.class;
            Intent intent = new Intent(getApplicationContext(), (Class<?>) activityToLaunch);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("openURL", launchUrl);
            startActivity(intent);


        }
    }
}

在你的webview课程中

String openURL = getIntent().getStringExtra("openURL");
  if (openURL != null) {
            Webview.loadUrl(openURL);
        }
        else{
            Webview.loadUrl(LINK);
        }

你的清单

  <application
        android:label="@string/app_name"
        android:name=".OnesignalApi"
        android:theme="@style/AppTheme">

        <meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />


</application>