まず、Androidコーディングの初心者ですが、ロジックは本当に混乱しています。もともとはFlash開発者であり、そこからの概念に精通していますが、Androidは新しい概念の完全なセットです。たとえば(間違っている場合は訂正してください)インテントはイベントのようなもので、BroadcastReceiverはEventListenerですか?
そうだとすれば、IntentはEventで、broadcastReceiverはeventListenerです。私の質問は、onReceiveメソッドで処理された変数データをどのように割り当てるかです。
私は長い間探していましたが、論理を理解していないことに本当に腹を立てています。物事をActionScript3とJavascriptと比較して関連付けようとしています(JSの一部はAS3にかなり近いものです)。
今、私が書き込もうとしているコードと私が得た問題について。
私はAdobeAIR用のAndroidネイティブ拡張機能を作成しようとしています...これまでのところ、少なくとも何らかの形で非常に優れています:)
マニフェストファイル:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.as3breeze.air"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BluetoothExtension"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ご覧のとおり、主なアクティビティは次のBluetoothExtension.javaです。FREExtension(Adobeがネイティブ拡張機能用に作成)を実装していることに注意してください。
package com.as3breeze.air;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
import com.as3breeze.air.BluetoothExtensionContext;
public class BluetoothExtension implements FREExtension {
protected BluetoothExtensionContext BEC;
/** Called when the activity is first created. */
@Override
public FREContext createContext(String arg0) {
BEC = new BluetoothExtensionContext();
return BEC;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
BEC.dispose();
BEC = null;
}
@Override
public void initialize() {}
}
それがアクティビティですよね?
そして、次のコンテキストを作成します(@importsを省略しています):
public class BluetoothExtensionContext extends FREContext {
public BluetoothAdapter bluetooth;
public Activity extensionActivity;
public FREArray nonBoundedDevices;
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public Map<String, FREFunction> getFunctions() {
Map<String, FREFunction> functionMap=new HashMap<String, FREFunction>();
functionMap.put("initialize", new Initialize());
// Leaving out some stuff here and listing only the important things...
functionMap.put("listDevices", new ListAvailableDevices());
return functionMap;
}
}
さて、上で見たように、アクセスしやすいようにいくつかのパブリック変数を取得しました。これらは、次のような新しいInitialize()内で開始されます。
package com.as3breeze.air;
import android.bluetooth.BluetoothAdapter;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.adobe.fre.FREWrongThreadException;
import com.as3breeze.air.BluetoothExtensionContext;
public class Initialize implements FREFunction {
@Override
public FREObject call(FREContext context, FREObject[] args) {
BluetoothExtensionContext bluetoothContext = (BluetoothExtensionContext) context;
bluetoothContext.bluetooth = BluetoothAdapter.getDefaultAdapter();
bluetoothContext.extensionActivity = bluetoothContext.getActivity();
FREObject returnData = null;
if( bluetoothContext.bluetooth == null )
{
try {
returnData = FREObject.newObject("notSupported");
} catch (FREWrongThreadException e) {}
}
return returnData;
}
}
開始は正常に機能します。Bluetoothの有効化/無効化、発見可能性など、マップにリストされている他の方法もあります。そこにあるすべてがうまく機能します。
しかし、問題はこれにあります:functionMap.put( "listDevices"、new ListAvailableDevices());
クラスが作成され、実行されて返されます。次のようになります。
package com.as3breeze.air;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.Toast;
import com.adobe.fre.FREASErrorException;
import com.adobe.fre.FREArray;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;
public class ListAvailableDevices implements FREFunction {
static FREArray returnDevicesArr = null;
@Override
public FREObject call(FREContext context, FREObject[] args) {
BluetoothExtensionContext bluetoothContext = (BluetoothExtensionContext) context;
returnDevicesArr = bluetoothContext.nonBoundedDevices;
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int index = 0;
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice bt = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText( context, "Searching devices...", Toast.LENGTH_SHORT).show();
FREArray deviceName;
try {
deviceName = FREArray.newArray(1);
deviceName.setObjectAt(0, FREObject.newObject(bt.getName()));
deviceName.setObjectAt(1, FREObject.newObject(bt.getAddress()));
returnDevicesArr.setObjectAt(index, deviceName);
index++;
} catch (FREASErrorException e) {
e.printStackTrace();
} catch (FREWrongThreadException e) {
e.printStackTrace();
} catch (FREInvalidObjectException e) {
e.printStackTrace();
} catch (FRETypeMismatchException e) {
e.printStackTrace();
}
}
}
};
bluetoothContext.extensionActivity.registerReceiver(mReceiver, filter);
bluetoothContext.bluetooth.startDiscovery();
return null; // Or to use return returnDeviceArr;
}
}
ご覧のとおり、call()から戻るためにreturnDeviceArrに、またはBluetoothExtensionContext.javaで定義された「グローバル」変数に、見つかったすべてのデバイスを保存しようとしています。どちらに進むかは関係ありません。それを取得する必要があります。データ。
onReceiveメソッドからreturnDeviceArr変数に到達できません。また、onReceive内に新しいFREArrayを作成し、そこにデバイスデータを格納することもテストしました。これにより、データを返すことはできますが、nullを返すことができます。call(){...}の下部で起動され、最終的にnull値が返されます。
では、どうすればそのreturnnullをreturnreturnDeviceArrに置き換えることができますか。利用可能なデバイスのアレイを取得しますか?
ビジュアルコンポーネントを使用せずにAndroidコーディングを理解し始めることができるように、コード例と説明を期待しています。