2016-05-29 9 views
3

NativeScriptの現在の状態で、Androidの共有インテントをリッスンするアプリを作成することはできますか?NativeScriptアプリに共有することはできますか?

私が達成したいのは、たとえば、Android上のWebブラウザでWebサイトを開いて共有をタップし、共有ターゲットのリストで自分のNativeScriptアプリケーションを参照することです。

ネイティブのAndroidアプリでこれを達成しましたが、NativeScriptアプリで動作させることはできません。私は、AndroidManifest.xmlを混乱させて、

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

をインテントフィルターに入れましたが、これは役に立ちませんでした。私のアプリは共有ターゲットのリストに表示されません。

答えて

1

NativeScriptはこのシナリオをそのままサポートする必要があります。ここではデフォルトのapp/App_resources/Androidで私AndroidManifestアプリケーションが見えるブートストラップ何のように:

<activity 
     android:name="com.tns.NativeScriptActivity" 
     android:label="@string/title_activity_kimera" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 

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

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="text/plain" /> 
     </intent-filter> 
</activity> 

編集:私の他のアプリケーションのいずれにも意図を送信するために 非常に単純な実装:

intent-に加えて
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent sendIntent = new Intent(Intent.ACTION_SEND); 
       sendIntent.setType("text/plain"); 
       sendIntent.putExtra("string", "the data Im sending you"); 

       Intent chooser = Intent.createChooser(sendIntent, "Share with "); 

       if (sendIntent.resolveActivity(getPackageManager()) != null) { 
        startActivity(chooser); 
       } 
      } 
     }); 
+0

私は実際にあなたの例で動作するので、私のコードで何かを混合する必要があります。プロジェクトでこのJavaスニペットを使用する方法がわかりませんが、まだアプリからインテントを送信する必要はありません。ありがとう@pkanev! – Najki

+0

2番目のコードスニペットは、インテントを送信する方法、Androidアプリケーションで使用する方法、またはNativeScriptアプリケーション(http://docs.nativescript.org)のJavaScript経由でネイティブAndroid APIにアクセスする方法を示すサンプルコードです。 /ランタイム/アンドロイド/ジェネレーター/エクステンドクラスインタフェース)。 – pkanev

2

フィルタをAppManifest.xmlに追加する必要があります アプリケーションを再構築することを確認してください(livesyncオプションはAppManifest.xmlの変更を反映していない可能性があります)

ここにNativeScrip基本的な株式のt実装

var app = require("application"); 

function onShare() { 

    var sharingIntent = new android.content.Intent(android.content.Intent.ACTION_SEND); 
    sharingIntent.setType("text/plain"); 
    var shareBody = "Here is the share content body"; 

    sharingIntent.addFlags(android.content.Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
    sharingIntent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK | android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here"); 
    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody); 

    app.android.context.startActivity(sharingIntent); 
} 
exports.onShare = onShare; 
+0

Thanks @ nick-iliev :) – Najki

1

アプリの初回起動であなたのAndroidManifest.xmlを更新/ App_Resources/AndroidManifest.xmlを

<application  android:name="com.tns.NativeScriptApplication"  android:allowBackup="true"  android:icon="@drawable/icon"  android:label="@string/app_name" 
       android:theme="@style/AppTheme">  <activity   android:name="com.tns.NativeScriptActivity" 
         android:label="@string/title_activity_kimera"   android:configChanges="keyboardHidden|orientation|screenSize"> 

         <intent-filter> 
       <action android:name="android.intent.action.MAIN" />         
       <category android:name="android.intent.category.LAUNCHER" />   </intent-filter>       
         <intent-filter> 
           <action android:name="android.intent.action.SEND" /> 
           <category android:name="android.intent.category.DEFAULT" /> 
           <category android:name="android.intent.category.APP_BROWSER" /> 
           <data android:mimeType="text/plain" /> 
           <data android:mimeType="image/*" /> 
         </intent-filter> 
         <intent-filter> 
          <action android:name="android.intent.action.SEND_MULTIPLE" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
          <category android:name="android.intent.category.APP_BROWSER" /> 
          <data android:mimeType="image/*" /> 
         </intent-filter> 
           </activity>   <activity android:name="com.tns.ErrorReportActivity"/> </application> 

以下のような以下のインテントフィルタを追加します。そして、次のコード行を追加します。あなたのapp.js内

application.android.on(application.AndroidApplication.activityResumedEvent, function (args) { 
     console.log("Event: " + args.eventName + ", Activity: " + args.activity); 
     var a = args.activity; 
     try { 
      var Intent_1 = android.content.Intent; 
      var actionSend = Intent_1.ACTION_SEND; 
      var actionSendMultiple = Intent_1.ACTION_SEND_MULTIPLE; 
      var argIntent = a.getIntent(); 
      var argIntentAction = argIntent.getAction(); 
      var argIntentType = argIntent.getType(); 
      console.log(" ~~~~ Intent is ~~~~ :" + new String(argIntent.getAction()).valueOf()); 
      String.prototype.startsWith = function (str) { 
       return this.substring(0, str.length) === str; 
      }; 
      if (new String(argIntentAction).valueOf() === new String(Intent_1.ACTION_SEND).valueOf()) { 
       if (new String(argIntentType).valueOf() === new String("text/plain").valueOf()) { 
        console.dump(cbParseTextAndUrl(argIntent)); 
       } 
       else if (argIntentType.startsWith("image/")) { 
        console.log(cbParseImageUrl(argIntent)); 
       } 
      } 
      else if (new String(argIntentAction).valueOf() === new String(Intent_1.ACTION_SEND_MULTIPLE).valueOf()) { 
       if (argIntentType.startsWith("image/")) { 
        var Uri = cbParseMultipleImageUrl(argIntent); 
        if (Uri !== null) { 
         var Uris = JSON.parse(Uri); 
         console.log(Uris); 
        } 
       } 
      } 
      function cbParseTextAndUrl(argIntent) { 
       var Patterns = android.util.Patterns; 
       //let Matcher = java.util.regex.Matcher; 
       var ListUrl = []; 
       var text = argIntent.getStringExtra(Intent_1.EXTRA_TEXT); 
       if (new String().valueOf() !== "null") { 
        var Matcher = Patterns.WEB_URL.matcher(text); 
        while (Matcher.find()) { 
         var url = Matcher.group(); 
         ListUrl.push(url); 
        } 
        return { "text": text, "listUrl": ListUrl }; 
       } 
      } 
      function cbParseImageUrl(argIntent) { 
       var imageUri = argIntent.getParcelableExtra(Intent_1.EXTRA_STREAM); 
       if (imageUri != null) { 
        // Update UI to reflect image being shared 
        return imageUri; 
       } 
      } 
      function cbParseMultipleImageUrl(argIntent) { 
       var imageUris = argIntent.getParcelableArrayListExtra(Intent_1.EXTRA_STREAM); 
       if (imageUris != null) { 
        // Update UI to reflect image being shared 
        return JSON.stringify(imageUris.toString()); 
       } 
      } 
     } 
     catch (e) { 
      console.log(e); 
     } 
    }); 

あなたのアプリにサードパーティーのアプリから。

関連する問題