Android 침묵 설치 구현

3257 단어 Android
Android 침묵 설치 방안 은 여러 가지 가 있 습 니 다.예 를 들 어 ProcessBuilder 나 Runtime.getRuntime().exec()를 이용 하여 pm isntal 명령 을 실행 하지만 이 방법 은 먼저 su 가 필요 합 니 다.루트 권한 이 필요 하거나 PackageManager.installPackage()를 반사 적 으로 가 져 와 야 합 니 다.사용 하기 도 번 거 롭 고 시스템 권한 도 가 져 와 야 합 니 다.API 21 이상 에 서 는 Package Installer.Session 으로 침묵 설 치 를 할 수 있 습 니 다.이 인터페이스 도 시스템 권한 android.permission.INSTALL 을 가 져 와 야 합 니 다.PACKAGES,긴 말 하지 않 고 코드 를 직접 올 립 니 다.
 public void install(@NonNull Context context,@NonNull String path) throws Exception {
        File file=new File(path);
        String apkName=path.substring(path.lastIndexOf(File.separator)+1,path.lastIndexOf(".apk"));
		//  PackageInstaller
		PackageInstaller packageInstaller = context.getPackageManager()
                .getPackageInstaller();
        PackageInstaller.SessionParams params=new PackageInstaller
                .SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        PackageInstaller.Session session=null;
        OutputStream outputStream=null;
        FileInputStream inputStream=null;
        try {
			//  Session
            int sessionId = packageInstaller.createSession(params);
			//  Session
            session=packageInstaller.openSession(sessionId);
			//     ,   apk  session
            outputStream = session.openWrite(apkName, 0, -1);
            inputStream=new FileInputStream(file);
            byte[] buffer=new byte[4096];
            int n;
			//  apk    session
            while ((n=inputStream.read(buffer))>0){
                outputStream.write(buffer,0,n);
            }
			//       ,      “files still open”
            inputStream.close();
            inputStream=null;
            outputStream.flush();
            outputStream.close();
            outputStream=null;
			//          intent,     activity
            Intent intent=new Intent();
            PendingIntent pendingIntent=PendingIntent.getActivity(mContext,0,intent,0);
            IntentSender intentSender = pendingIntent.getIntentSender();
			//      
            session.commit(intentSender);

        } catch (IOException e) {
            throw new RuntimeException("Couldn't install package", e);
        } catch (RuntimeException e) {
            if (session != null) {
                session.abandon();
            }
            throw e;
        }finally {
            closeStream(inputStream);
            closeStream(outputStream);
        }

    }

설명 이 명확 하 게 설명 되 어 있 으 면 더 이상 설명 하지 않 습 니 다.설치 과정의 상 태 를 가 져 오 려 면 createSession 전에 Package Inataller 에 Session Callback 을 등록 하여 가 져 올 수 있 습 니 다.
packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {
            @Override
            public void onCreated(int sessionId) {
                
            }

            @Override
            public void onBadgingChanged(int sessionId) {

            }

            @Override
            public void onActiveChanged(int sessionId, boolean active) {

            }

            @Override
            public void onProgressChanged(int sessionId, float progress) {

            }

            @Override
            public void onFinished(int sessionId, boolean success) {

            }
        });

좋은 웹페이지 즐겨찾기