anze87
anze87

Reputation: 253

can't start intent startActivityForResult from class

I will be very happy if someone can help me, because I'm new at object programming. My problem is: I'm writting some app with bluetooth communication. I wrote all methods and successfully connect and transfer data between devices in MainActivity.class. I have also one SearchActivity.class which shows all devices in range on List, so user can pick one. Device is then passed through Intent to MainActivity, where connection starts. But because of nature of my app I must created separate class, just for Bluetooth communication called BluetoothService.class. I moved all methods for Bluetooth and other stuff to BluetoothService.class. Now I even can't compile my project, because I get error at creating Intent for SearchActivity, I also get error startActivityForResult and onActivityResult methods.

First error is: The constructor Intent(BluetoothService, Class) is undefined

Second error: The method startActivityForResult(Intent, int) is undefined for the type BluetoothService

public void startConnection() {
    // Create an intent for SearchActivity 
    Intent intent = new Intent(this, SearchActivity.class);
    //start SearchActivity through intent and expect for result. 
    //The result is based on result code, which is REQUEST_DISCOVERY
    startActivityForResult(intent, REQUEST_DISCOVERY);              
}  

When I was calling method startConnection() from MainActivity everything worked, but now I it doesn't. I think the problem is, that I can't create new Activity from non-activity class.

Next error is in onActivityResult method: *RESULT_OK cannot be resolved to a variable*

//on ActivityResult method is called, when other activity returns result through intent!
//when user selected device in SearchActivity, result is passed through intent with //requestCode, resultCode (intent data + requestCode + resultCode)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != REQUEST_DISCOVERY) {
    Log.d("Debug", ">>intent REQUEST_DISCOVERY failed!");
    return;
    }
    if (resultCode != RESULT_OK) {
    Log.d("Debug", ">>intent RESULT_OK failed!");
    return;
    }
    Log.d("Debug", ">>onActivityResult!");
    final BluetoothDevice device = data.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

    Log.d(device.getName(), "Name of Selected Bluetoothdevice");


    new Thread () {
        public void run() {
        //call connect function with device argument
        connect(device);
        };
    }.start();
    }

Please, tell me how can I solve this. If you need more info or code tell me. Thanks.

public class SearchActivity  extends ListActivity
{
    //name of LxDevices, that will be shown on search
    private String nameOfLxDevice = "DEBUG";

    private Handler handler = new Handler();
    /* Get Default Adapter */
    private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    /* Storage the BT devices */
    private List<BluetoothDevice> devices = new ArrayList<BluetoothDevice>();
    /* Discovery is Finished */
    private volatile boolean discoveryFinished;


    /* Start search device */ 
    private Runnable discoveryWorker = new Runnable() {
        public void run() 
        {
            //To start discovering devices, simply call startDiscovery(). The process is asynchronous and the method will 
            //immediately return with a boolean indicating whether discovery has successfully started.
            mBluetoothAdapter.startDiscovery();
            Log.d("debug", ">>Starting Discovery");
            for (;;) 
            {
                if (discoveryFinished) 
                {
                    Log.d("debug", ">>Finished");
                    break;
                }
                try 
                {
                    Thread.sleep(100);
                } 
                catch (InterruptedException e){}
            }
        }
    }; 

    /* when discovery is finished, this will be called */
    //Your application must register a BroadcastReceiver for the ACTION_FOUND Intent in order to receive information about each device discovered.
    //For each device, the system will broadcast the ACTION_FOUND Intent. This Intent carries the extra fields EXTRA_DEVICE and EXTRA_CLASS,
    //containing a BluetoothDevice and a BluetoothClass, respectively

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            /* get the search results */
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);               
                //add it on List<BluetoothDevice>
                devices.add(device);
                //show found LxDevice on list
                showDevices();
            }           
        }
    };

    private BroadcastReceiver discoveryReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent)  
        {
            /* unRegister Receiver */
            Log.d("debug", ">>unregisterReceiver");
            unregisterReceiver(mBroadcastReceiver);
            unregisterReceiver(this);
            discoveryFinished = true;
        }
    };

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        /* BT isEnable */
        if (!mBluetoothAdapter.isEnabled())
        {
            Log.w("debug", ">>BT is disable!");
            finish();
            return;
        }
        /* Register Receiver*/
        IntentFilter discoveryFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(discoveryReceiver, discoveryFilter);
        IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mBroadcastReceiver, foundFilter);


        /* show a dialog "Scanning..." */ 
        SamplesUtils.indeterminate(SearchActivity.this, handler, "Scanning for LX devices..", discoveryWorker, new OnDismissListener() {
            public void onDismiss(DialogInterface dialog)
            {
                for (; mBluetoothAdapter.isDiscovering();) {
                    // Discovery is resource intensive.  Make sure it isn't going on when you attempt to connect and pass your message.
                    mBluetoothAdapter.cancelDiscovery();
                }
                discoveryFinished = true;
            }
        }, true); 
    }

    /* Show devices list */
    private void showDevices()
    {
        //Create a list of strings
        List<String> list = new ArrayList<String>();
        for (int i = 0, size = devices.size(); i < size; ++i) {
            StringBuilder b = new StringBuilder();
            BluetoothDevice d = devices.get(i);
            b.append(d.getName());
            b.append('\n');
            b.append(d.getAddress());
            String s = b.toString();
            list.add(s);
        }

        Log.d("debug", ">>showDevices");
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
        handler.post(new Runnable() {
            public void run()
            {
                setListAdapter(adapter);
            }
        });
    }

    /* Select device */
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Log.d("debug", ">>Click device");
        Intent result = new Intent();
        result.putExtra(BluetoothDevice.EXTRA_DEVICE, devices.get(position));
        setResult(RESULT_OK, result);
        finish();
    }

}

In MainActivity I am doing:

// Initialize the BluetoothChatService to perform bluetooth connections
    mBluetoothService = new BluetoothService(this);

Constructor in BluetoothService is:

 public BluetoothService(Context context) {

    }

connect method:

protected void connect(BluetoothDevice device) {
    try {
    //Create a Socket connection: need the server's UUID number of registered
    BluetoothSocket socket = null;
    socket = device.createRfcommSocketToServiceRecord(MY_UUID);         
    socket.connect();
        //Create temporary input and output stream
         InputStreamtmpIn=socket.getInputStream();                                                      
    OutputStream tmpOut = socket.getOutputStream();

    //for use purposes
    mmSocket = socket;
    mmOutStream = tmpOut;
    mmInStream = tmpIn;

    tmpOut.write("Device connected..".getBytes());

    //start Thread for receiving data over bluetooth
    //dataReceiveThread.start();

    } catch (IOException e) {
        Log.e("Colibri2BB BT", "", e);
    } 
}

Upvotes: 2

Views: 23712

Answers (4)

bugraoral
bugraoral

Reputation: 2670

Your BluettoothService class is not a context and to initialise an Intent you need a context.So try creating your class like this:

    public class BluettoothService{

    Activity activity;

    BluettoothService(Activity activity){
    this.activity=activity;
    }
    public void startConnection() {
    // Create an intent for SearchActivity 
    Intent intent = new Intent(activity, SearchActivity.class);
    //start SearchActivity through intent and expect for result. 
    //The result is based on result code, which is REQUEST_DISCOVERY
    activity.startActivityForResult(intent, REQUEST_DISCOVERY);              
    } 


}

And you can create the BluettoothService class this way from any activity:

BluettoothService bluetooth=new BluettoothService(this);

Edit:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_DISCOVERY) {
Log.d("Debug", ">>intent REQUEST_DISCOVERY failed!");
return;
}
if (resultCode != Activity.RESULT_OK) {
Log.d("Debug", ">>intent RESULT_OK failed!");
return;
}
Log.d("Debug", ">>onActivityResult!");
final BluetoothDevice device = data.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

Log.d(device.getName(), "Name of Selected Bluetoothdevice");


new Thread () {
    public void run() {
    //call connect function with device argument
    connect(device);
    };
}.start();
}

Upvotes: 6

Sharad Mhaske
Sharad Mhaske

Reputation: 1103

//create this class that hold application context.

public class Application_Manager extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        Application_Manager.context = getApplicationContext();

    }

    public static Context getAppContext() {
        return Application_Manager.context;
    }
}

//use this class getAppcontext() to get context in non-activity class.

public class BluettoothService{

    static Context context=Application_Manager.getAppContext();
    public void startConnection() {
    Intent intent = new Intent(context, SearchActivity.class);
    context.startActivityForResult(intent, REQUEST_DISCOVERY);//change edited              
    } 


}

Upvotes: 0

VincentLamoute
VincentLamoute

Reputation: 810

You should to specify the @override for the onActivityResult().

Your code should to be put into a class who extends 'activity' (android.app.Activity). It's for that you have also this :

Next error is in onActivityResult method: *RESULT_OK cannot be resolved to a variable*

This cannot be resolved because your class don't extends 'Activity'

Upvotes: 0

Blackbelt
Blackbelt

Reputation: 157437

You can't use this of a Service to start an ActivityForResult

Upvotes: 2

Related Questions