摄影机在牛轧糖中第二次拍摄时,相机接收器无法检测到图像

时间:2018-02-06 11:08:45

标签: android android-camera-intent android-7.0-nougat

我已经为Nougat设备创建了一个应用程序,我的应用程序正在检测摄像机拍摄的所有图像,并且我将这些图像发送到服务器中。我的应用程序成功发送了相机拍摄的第一张照片,但接收器既未检测到我正在拍摄的第二张图像,也未将其发送到服务器。我有一个ConfigurationBuilder类,每隔30分钟就会触发camera以及cameraReceiverservice类检测新图片,我已经注册了接收器。

ConfigurationBuilder.java

public class ConfigurationBuilder extends JobService {
JobParameters mRunningParams;
static final int PROJECTION_ID = 0;
static final int PROJECTION_DATA = 1;
static final String DCIM_DIR = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DCIM).getPath();
static final String[] PROJECTION = new String[] {
        MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA
};
static final List<String> EXTERNAL_PATH_SEGMENTS
        = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPathSegments();

String TAG = "JobService";
private Context mContext;

@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public boolean onStartJob(JobParameters jobParameters) {
    mContext = getApplicationContext();
    getSettingResponse(true);
    jobFinished(jobParameters, false);
    Log.d(TAG, "onStartJob: ");
    return true;
}



private void getSettingResponse(boolean fromJobScheduler) {

    try {

        if (fromJobScheduler)
            new DataClear();

        OkHttpClient client = new SSLManager().getClientKeyNonDeprecated(mContext);


        // code request code here
        HttpUrl.Builder urlBuilder =
                HttpUrl.parse(mContext.getSharedPreferences(NetworkAPI.PREFNAME,Context.MODE_PRIVATE ).getString("configuration_url", "")).newBuilder();
        //urlBuilder.addQueryParameter("device",  CommonMethods.getBluetoothName());
        urlBuilder.addQueryParameter("device", "FranksS7");
        urlBuilder.addQueryParameter("membership", "Phone Network");
        urlBuilder.addQueryParameter("membershipType", "Domain");
        Request request = new Request.Builder().addHeader("Accept", "application/json")
                .url(urlBuilder.build()).get()
                .build();


        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: " + e.getMessage());
                getConfigure(null);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (!response.isSuccessful()) {
                    Log.d(TAG, "onResponse:Unexpected code" + response.body().string());
                } else {
                    getConfigure(response.body().string());
                }
            }
        });



    } catch (Exception e) {
        Log.d(TAG, "getSettingResponse: " + e.getMessage());
    }


}


@Override
public boolean onStopJob(JobParameters jobParameters) {
    return false;
}


private void getConfigure(String response) {

    try {
        if (response != null) {
            JSONArray policies = new JSONObject(response).getJSONArray("Policies");
            for (int i = 0; i < policies.length(); i++) {
                JSONObject obj = policies.getJSONObject(i);

                Iterator iterator = obj.keys();
                String key = (String) iterator.next();
                JSONObject issue = obj.getJSONObject(key);
                String value = issue.optString("Value");

                RecorderPolicies policiesField = new Select()
                        .from(RecorderPolicies.class)
                        .where("Policy = ?", key).executeSingle();

                if (policiesField != null) {
                    policiesField.Value = value;
                    long res = policiesField.save();
                    // new Update(RecorderPolicies.class).set("Value = ?",value).where("Policy = ?", key).execute();

                } else {
                    RecorderPolicies recorderPolicies = new RecorderPolicies();
                    recorderPolicies.Policy = key;
                    recorderPolicies.Value = value;
                    long res = recorderPolicies.save();
                }

            }
        }
        if (isMyServiceRunning(ApplicationService.class)) {
            // stopService(new Intent(mContext, ApplicationService.class));
            Log.d(TAG, "Service Terminated");

        }

        if (new RecorderPolicies().getActivateCode("CanRecordDetailedData"))
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    mContext.startService(new Intent(mContext, ApplicationService.class));
                    Log.d(TAG, "Service Restarted");
                }
            }, 10000);
        else
            Log.d(TAG, "----------------------problem starting service---------------------");
    } catch (Exception e) {
        Log.d(TAG, "getConfigure: " + e.getMessage());
    }
}




@RequiresApi(api = Build.VERSION_CODES.N)
public void startConfigurationScheduler(int JobID, Context activityContext) {
   mContext = activityContext;
    ComponentName jobService =
            new ComponentName(activityContext, ConfigurationBuilder.class.getName());
    JobInfo  jobInfo =
            new JobInfo.Builder(JobID, jobService)
                    .setPersisted(true).setRequiresDeviceIdle(true)
                    //updated code for nougat...............................................................on 12/11/2017
                    //.setPeriodic(32*60000, (long) (1.6*60000)).build();
                    .setPeriodic(32 * 60000).build();



    JobScheduler jobScheduler = (JobScheduler) activityContext.getSystemService(JOB_SCHEDULER_SERVICE);
    jobScheduler.schedule(jobInfo);

    getSettingResponse(false);



}


public void stopConfigurationScheduler(int JobID, Context activityContext) {

    JobScheduler jobScheduler = (JobScheduler) activityContext.getSystemService(JOB_SCHEDULER_SERVICE);
    jobScheduler.cancel(JobID);
}


private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) mContext.getSystemService(ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            Process.killProcess(service.pid); // kill service
            return true;
        }
    }
    return false;
}

}

CameraReceiver .java

public class CameraReceiver extends BroadcastReceiver {

private String pathSplit;
private String type;
Context mContext;


@Override
public void onReceive(Context context, Intent intent) {
    mContext=context;
    Cursor cursor = context.getContentResolver().query(intent.getData(),
            null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        String image_path = cursor.getString(cursor.getColumnIndex("_data"));
        String MediaType = intent.getAction().equals("android.hardware.action.NEW_VIDEO") ? "VIDEO" : "IMAGE";
        FilesObservers.postDataCreateEvent("CREATE", image_path, true,MediaType);
        cursor.close();
    }

}

public IntentFilter getVideoFilters() {
    IntentFilter lsIntentFilter = new IntentFilter();
    try {
        lsIntentFilter.addDataType("video/*");
    } catch (IntentFilter.MalformedMimeTypeException e) {
        e.printStackTrace();
    }
    lsIntentFilter.addAction("android.hardware.action.NEW_VIDEO");
    lsIntentFilter.addCategory("android.intent.category.DEFAULT");
    return lsIntentFilter;
}


public IntentFilter getCameraFilters() {

    IntentFilter lsIntentFilter = new IntentFilter();
    try {
        lsIntentFilter.addDataType("image/*");
    } catch (IntentFilter.MalformedMimeTypeException e) {
        e.printStackTrace();
    }   //lsIntentFilter.addAction("JobInfo.Builder.addTriggerContentUri(JobInfo.TriggerContentUri)");
 lsIntentFilter.addAction("android.provider.MediaStore.ACTION_IMAGE_CAPTURE)");
    lsIntentFilter.addCategory("android.intent.category.DEFAULT");
    return lsIntentFilter;
}

}

1 个答案:

答案 0 :(得分:1)

In Nougat ACTION_NEW_VIDEO and ACTION_NEW_PICTURE broadcasts were removed。 相反,他们建议使用JobInfo.Builder.JobInfo.Builder.addTriggerContentUri(JobInfo.TriggerContentUri) 有趣的是,在Android O中,该广播已重新播放-仅适用于注册接收者。